IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Compter le nombre d'occurence d'un caractère donné, par ligne du fichier


Sujet :

Shell et commandes GNU

  1. #1
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 685
    Points
    13 685
    Billets dans le blog
    1
    Par défaut Compter le nombre d'occurence d'un caractère donné, par ligne du fichier
    Bonjour,

    J'ai un fichier contenant plusieurs (séparées par un retour chariot donc). Chaque ligne est constituée de plusieurs champs, le séparateur de champ étant | (barre verticale). Certains champs peuvent être vides.

    Mon objectif : compter le nombre de champs, y compris les champs vides.

    J'ai d'abord essayé avec une commande AWK (inspirée ce qu'il y a ici) :

    cat conversion.txt | awk -F "|" '{ print "Ligne n" NR " il y a " NF " champs" ; } '
    Le problème est que les champs vides ne sont pas comptés...

    Je me suis donc mis en tête de compter le nombre de caractères | par ligne, mais ce n'est pas très fructueux... Je pense en être pas loin avec ça :

    cat conversion.txt.bak | xargs -I varligne echo varligne | grep -o "|" | wc -l
    mais le wc -l se fait sur tout et non pour la ligne en cours. J'obtiens donc un magnifique 417, le nombre total de | du fichier


    Si quelqu'un a une idée pour m'aiguiller, je serai très content !

    Merci d'avance !

  2. #2
    Membre averti Avatar de FRUiT
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2011
    Messages : 83
    Points : 337
    Points
    337
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{ x=0; x+=gsub("\\|",""); print x }' conversion.txt

  3. #3
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,
    Citation Envoyé par Bktero Voir le message
    Mon objectif : compter le nombre de champs, y compris les champs vides.

    J'ai d'abord essayé avec une commande AWK (inspirée ce qu'il y a ici) :

    Le problème est que les champs vides ne sont pas comptés...
    Tu es sûr ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ cat plop
    a|b||d|e||g
    1|2|3|4|5|6|7
    
    $ awk -F'|' '{ print "ligne " NR " a " NF " champs" }' plop
    ligne 1 a 7 champs
    ligne 2 a 7 champs
    
    $
    Tu as dû louper un truc, non ?

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 685
    Points
    13 685
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Vos deux solutions donnent le même résultat. C'est déjà bien

    Oui, quelque chose doit m'échapper. Je compte à la main, je ne trouve pas le même nombre que la commande. Je ne pense pourtant pas être fou ou aveugle. Voici l'un des lignes du fichier par exemple :

    Export_D4|Forfait|Gestion des Paiements|Fermé|$DATEDUJOUR|$DATEDUJOUR|_ERCAUTO|_ERCAUTO|$DATEDUJOUR|FACTURE|Recouvrement|Pénalité retard de paiement|Facturée|Spain Telecom|Clos|Fermé|5 euros TTC|||$DATEDUJOUR||$DATEDUJOUR|Traitement SpTel|_ERCAUTO|_ERCAUTO|$DATEDUJOUR
    Visuellement, je compte 26 champs et (très logiquement) 25 barres. En revanche, je compte effectivement 23 champs non vides.

    Vos lignes me donnent :
    ligne 1 a 23 champs
    Quelque chose m'échappe....

  5. #5
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Pour la solution de FRUIT, il faut initialiser la variable x à 1 et non pas à 0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{ x=1; x+=gsub("\\|",""); print x }'

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 685
    Points
    13 685
    Billets dans le blog
    1
    Par défaut
    Euh....Quand je dis que quelque chose m'échappe, c'est par rapport à la différence entre mon compte visuel et le compte des lignes de commandes ; mais pas entre la différence entre vos deux lignes ! Tu comptes les champs, et FRUIT les séparateurs de champs, j'avais tilté

    Non, mais je voudrais savoir pourquoi je compte 25/26 et que vos lignes trouvent 22/23

  7. #7
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 262
    Points
    12 262
    Par défaut
    le classique oubli, sur le comptage numéraire qui commence à 1 au lieu de zéro...
    me serai fait avoir aussi moi ...

  8. #8
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Change de lunettes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ echo $VAR
    Export_D4|Forfait|Gestion des Paiements|Fermé|||_ERCAUTO|_ERCAUTO||FACTURE|Recouvrement|Pénalité retard de paiement|Facturée|Spain Telecom|Clos|Fermé|5 euros TTC||||||Traitement SpTel|_ERCAUTO|_ERCAUTO|
    
    $ awk '{ x=1; x+=gsub("\\|",""); print x }' <<<$VAR
    26
    
    $ awk -F'|' '{ print "ligne " NR " a " NF " champs" }' <<<$VAR
    ligne 1 a 26 champs

  9. #9
    Membre averti Avatar de FRUiT
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2011
    Messages : 83
    Points : 337
    Points
    337
    Par défaut
    Ceci dit moi je répondais au titre du thread qui est :
    Citation Envoyé par title
    Compter le nombre d'occurence d'un caractère donné, par ligne du fichier
    Et donc le x=0 était là pour ça
    J'aurais du répondre au message au temps pour moi.

  10. #10
    Membre averti Avatar de FRUiT
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2011
    Messages : 83
    Points : 337
    Points
    337
    Par défaut
    En ce qui concerne la commande de zipe31 cela pourrait éventuellement s'expliquer par une version de awk différente, ou bien un alias sur awk avec une option qui omet les champs vides...

    Pour ce qui est de ma commande c'est quand même beaucoup plus bizarre.

  11. #11
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 685
    Points
    13 685
    Billets dans le blog
    1
    Par défaut
    toto.txt étant un fichier où je copie la ligne depuis mon précédent post sur ce forum...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    dvligis3@bt1shlnm:/GCFDEV07/dvligis3/pgt>
    awk '{ x=1; x+=gsub("\\|",""); print x }' toto.txt
    23
    dvligis3@bt1shlnm:/GCFDEV07/dvligis3/pgt>
    cat toto.txt
    Export_D4|Forfait|Gestion des Paiements|FerméDATEDUJOUR|$DATEDUJOUR|_ERCAUTO|_ERCAUTO|$DATEDUJOUR|FACTURE|Recouvrement|Pélitéetard de paiement|FacturéSpain Telecom|Clos|Fermé euros TTC|||$DATEDUJOUR||$DATEDUJOUR|Traitement SpTel|_ERCAUTO|_ERCAUTO|$DATEDUJOUR
    dvligis3@bt1shlnm:/GCFDEV07/dvligis3/pgt>
    awk -F'|' '{ print "ligne " NR " a " NF " champs" }' toto.txt
    ligne 1 a 23 champs
    J'adore



    Si je tape awk dans ma console, j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    dvligis3@bt1shlnm:/GCFDEV07/dvligis3/pgt>
    awk
    Usage: awk [POSIX or GNU style options] -f progfile [--] file ...
    Usage: awk [POSIX or GNU style options] [--] 'program' file ...
    POSIX options:          GNU long options:
            -f progfile             --file=progfile
            -F fs                   --field-separator=fs
            -v var=val              --assign=var=val
            -m[fr] val
            -W compat               --compat
            -W copyleft             --copyleft
            -W copyright            --copyright
            -W dump-variables[=file]        --dump-variables[=file]
            -W exec=file            --exec=file
            -W gen-po               --gen-po
            -W help                 --help
            -W lint[=fatal]         --lint[=fatal]
            -W lint-old             --lint-old
            -W non-decimal-data     --non-decimal-data
            -W profile[=file]       --profile[=file]
            -W posix                --posix
            -W re-interval          --re-interval
            -W source=program-text  --source=program-text
            -W traditional          --traditional
            -W usage                --usage
            -W version              --version
    
    To report bugs, see node `Bugs' in `gawk.info', which is
    section `Reporting Problems and Bugs' in the printed version.
    
    gawk is a pattern scanning and processing language.
    By default it reads standard input and writes standard output.
    
    Examples:
            gawk '{ sum += $1 }; END { print sum }' file
            gawk -F: '{ print $1 }' /etc/passwd
    Ca me parle de gawk à la fin... Une implémentation différente peut-être ?



    En revanche, quand je tape alias, il n'y a aucune trace de awk....

  12. #12
    Membre averti Avatar de FRUiT
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2011
    Messages : 83
    Points : 337
    Points
    337
    Par défaut
    Ca dit quoi ?

    Tu es sur quel type de système ?

    Moi ça dit :
    Ok, ça doit être un problème d'encodage de caractères, si je copie-colle ta ligne j'ai aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    > echo "Export_D4|Forfait|Gestion des Paiements|FerméDATEDUJOUR|$DATEDUJOUR|_ERCAUTO|_ERCAUTO|$DATEDUJOUR|FACTURE|Recouvrement|Pélitéetard de paiement|FacturéSpain Telecom|Clos|Fermé euros TTC|||$DATEDUJOUR||$DATEDUJOUR|Traitement SpTel|_ERCAUTO|_ERCAUTO|$DATEDUJOUR" | awk '{ x=1; x+=gsub("\\|",""); print x }'
    23
    Y'a des petits 'é' un peu partout...

    Exemple là il manque une barre et le dollar déjà :
    Entre "Fermé" et "$DATEDUJOUR"

  13. #13
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    L'exemple de ligne que tu as donné plus haut et le contenu de ton fichier toto.txt sont différents

    Normal que les résultats diffèrent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ cat plop     # ton fichier toto.txt
    Export_D4|Forfait|Gestion des Paiements|FerméDATEDUJOUR|$DATEDUJOUR|_ERCAUTO|_ERCAUTO|$DATEDUJOUR|FACTURE|Recouvrement|Pélitéetard de paiement|FacturéSpain Telecom|Clos|Fermé euros TTC|||$DATEDUJOUR||$DATEDUJOUR|Traitement SpTel|_ERCAUTO|_ERCAUTO|$DATEDUJOUR
    
    $ awk -F'|' '{ print "ligne " NR " a " NF " champs" }' plop
    ligne 1 a 23 champs
    
    $ cat foo     # L'exemple de ligne donné plus haut
    Export_D4|Forfait|Gestion des Paiements|Fermé|||_ERCAUTO|_ERCAUTO||FACTURE|Recouvrement|Pénalité retard de paiement|Facturée|Spain Telecom|Clos|Fermé|5 euros TTC||||||Traitement SpTel|_ERCAUTO|_ERCAUTO|
    
    $ awk -F'|' '{ print "ligne " NR " a " NF " champs" }' foo
    ligne 1 a 26 champs
    $

  14. #14
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 685
    Points
    13 685
    Billets dans le blog
    1
    Par défaut
    La version de awk est 3.15. Le système est Red Hat (mais je n'en connais pas la version).

    Effectivement, je n'avais pas vu que des barres souhaitaient lors du copié-collé ! J'avais vu que les accents partaient en sucette, mais loin de moi l'idée que ça pouvait dégager des barres !

    J'utilise vim comme éditeur (via Putty), y a t-il un moyen de ne pas avoir ce remplacement barbare des caractères ?


    Désolé pour le dérangement

    Et merci pour votre aide !

  15. #15
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Citation Envoyé par Bktero Voir le message
    La version de awk est 3.15. Le système est Red Hat (mais je n'en connais pas la version).
    Essayes via la commande :

    Sinon avec la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat /etc/{issue,release,version}

    Effectivement, je n'avais pas vu que des barres souhaitaient lors du copié-collé ! J'avais vu que les accents partaient en sucette, mais loin de moi l'idée que ça pouvait dégager des barres !

    J'utilise vim comme éditeur (via Putty), y a t-il un moyen de ne pas avoir ce remplacement barbare des caractères ?
    Dans putty il te faut choisir l'encodage de caractère approprié par rapport à ton système. Ça se configure dans "Windows => Translation".

  16. #16
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 685
    Points
    13 685
    Billets dans le blog
    1
    Par défaut
    LSB Version: :core-3.1-amd64:core-3.1-ia32:core-3.1-noarch:graphics-3.1-amd64:graphics-3.1-ia32:graphics-3.1-noarch
    Distributor ID: RedHatEnterpriseServer
    Description: Red Hat Enterprise Linux Server release 5.5 (Tikanga)
    Release: 5.5
    Codename: Tikanga
    Je vais essayer pour l'encodage, merci bien

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/07/2012, 11h25
  2. [RegEx] Compter le nombre d'occurences d'un mot
    Par Shuny dans le forum Langage
    Réponses: 10
    Dernier message: 19/12/2009, 18h58
  3. Compter le nombre d'occurences d'un mot dans un texte
    Par AlexandraS dans le forum Langage
    Réponses: 13
    Dernier message: 26/03/2008, 09h12
  4. [Tableaux] compter le nombre d'occurence
    Par Joe Le Mort dans le forum Langage
    Réponses: 8
    Dernier message: 07/12/2006, 16h08
  5. Réponses: 8
    Dernier message: 18/01/2005, 10h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo