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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 499
    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 expérimenté Avatar de FRUiT
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2011
    Messages : 83
    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 confirmé

    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
    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
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 499
    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 confirmé

    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
    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
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 499
    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 confirmé

    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
    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

  8. #8
    Expert confirmé 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 : 49
    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
    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 ...

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/07/2012, 12h25
  2. [RegEx] Compter le nombre d'occurences d'un mot
    Par Shuny dans le forum Langage
    Réponses: 10
    Dernier message: 19/12/2009, 19h58
  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, 10h12
  4. [Tableaux] compter le nombre d'occurence
    Par Joe Le Mort dans le forum Langage
    Réponses: 8
    Dernier message: 07/12/2006, 17h08
  5. Réponses: 8
    Dernier message: 18/01/2005, 11h58

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