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'occurrences d'un motif dans chaque ligne commande shell


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2009
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 63
    Points : 86
    Points
    86
    Par défaut Compter le nombre d'occurrences d'un motif dans chaque ligne commande shell
    Bonjour à tous,

    j'ai une question qui parait assez simple et j'aurais besoin de votre aide.
    Comment je peux compter le nombre d’occurrence d'un motif dans chaque ligne d'un fichier?

    Chaque ligne de mon fichier contient deux champs séparés par le séparateur "|" :
    champ1 | champ 2
    mot1 mot2 | mot 6 mot7

    ..................

    Et je voudrais compter le nombre d'occurrence d'un caractère par exemple le point "." dans le deuxième champ de chaque ligne et l'afficher.


    la commande

    cat lefichier | grep "mot" | wc -l

    me permet que de le nombre de lignes qui contiennent un certain motif.

    Je vous remercies à l'avance

  2. #2
    Membre expérimenté Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    Par défaut
    Bonjour,
    Attention à l'UUOC (wikipédia/UUOC)
    Avec un cut pour récupérer le second champs. Puis un grep en récupérant toutes les occurrences. ça comptera le nombres de '.' dans tout les seconds champs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cut -d\| -f2 lefichier| grep -o "\." | wc -l
    Citation Envoyé par man
    -o, --only-matching show only the part of a line matching PATTERN
    Pour avoir le nombre de '.' dans chaque second champs ligne par ligne il faut passer par un awk comme ici
    Il était une fois [...] Et ils vécurent heureux et eurent beaucoup d'enfants!

  3. #3
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Bonsoir.

    Avec awk en une seule commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F "|" '{if ($2 ~ /\./){nb++}} END {print nb}' file.txt
    Si tu ne souhaites pas compter les occurrences en double :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F "|" '{if (!($2 in t) && $2 ~ /\./){t[$2]=$2}} END {print length(t)}' file.txt
    EDIT : mal lu => "le nombre de '.' dans le deuxième champs". Une solution possible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cut -d "|" -f2 file.txt | awk -F "." "{print NF-1}"
    Cordialement,
    Idriss

  4. #4
    Membre régulier
    Inscrit en
    Septembre 2009
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 63
    Points : 86
    Points
    86
    Par défaut
    Merci Ivelios et ok.Idriss pour vos réponses.

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    facilement adaptable en awk si le fichier comporte beaucoup de ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char='.'
    while IFS='|' read -ra ar
    do
       sans="${ar[1]//$char/}"
       echo $((${#ar[1]}-${#sans}))
    done < fichier
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre régulier
    Inscrit en
    Septembre 2009
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 63
    Points : 86
    Points
    86
    Par défaut
    Merci N_BaH pour ta réponse

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 23/09/2017, 22h15
  2. Compter le nombre d'occurrences d'un mot dans un fichier texte
    Par kandro dans le forum Shell et commandes GNU
    Réponses: 8
    Dernier message: 31/12/2011, 15h32
  3. Réponses: 0
    Dernier message: 31/05/2011, 18h58
  4. Réponses: 3
    Dernier message: 21/08/2009, 15h16
  5. Réponses: 2
    Dernier message: 18/04/2008, 16h19

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