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 mot dans un fichier texte


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 18
    Par défaut Compter le nombre d'occurrences d'un mot dans un fichier texte
    Bonjour,
    j'aimerai compter le nombre d’occurrences de chaque mots dans un fichier texte, par exemple le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Kandro@linux:~$ cat truc
    de monde depuis
    de
    monde
    depuis
    Lorsque j'exécute le script :

    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
    #!/bin/bash
     
    for mot in $(cat truc)                    
    do                                            
    	grep -o "$mot" truc > compteur   
     
    	set `wc -l compteur `
     
    	if [ $1 -gt 0 ]
    	then 
    		echo "$mot : $1">>mots
    		sed 's/'$mot'/ /g' truc > txttemp
    		cat txttemp>truc
    	fi
    done
    j'obtiens

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Kandro@linux:~$ cat mots
    de : 6
    Kandro@linux:~$ cat truc
      mon   puis
     
    mon 
     puis
    J'ai essayé de palier à ce problème en faisant :

    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
    for mot in $(cat truc)                    
    do                                            
    	grep -o "$mot" truc > compteur   
     
    	set `wc -l compteur `
     
    	if [ $1 -gt 0 ]
    	then 
    		echo "$mot : $1">>mots
    		sed 's/[[:space:]]'$mot'[[:space]]/ /g' truc > txttemp
    		sed 's/^'$mot'[[:space]]/ /g' txttemp>truc
    		sed 's/[[:space:]]'$mot'$/ /g' truc > txttemp
    		sed 's/^'$mot'$/ /g' txttemp>truc
    	fi
    done
    Mais là le terminal me dit qu'il y a une erreur de syntaxe dans sed, et je n'arrive pas à la retrouver.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 672
    Par défaut
    Bonjour,

    à partir de BASH 4, comme en awk, tu peux utiliser un tableau associatif, qui prendra en index chaque mot du fichier, et qui sera incrémenté à chaque occurrence.

    Et, mes amis notez-le bien, j'accepte, ici, exceptionnellement, j'insiste, qu'on fasse for mot in $(cat fichier), parce qu'on veut itérer sur chaque mot de la sortie de la commande.
    mais on peut se passer du cat, car il n'y a qu'un fichier, et utiliser for mot in $(< fichier).
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  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,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $ cat plop 
    de monde depuis
    deux puits
    monde
    depuis
     
    $ sed 's/ /\n/g' plop | sort | uniq -c
          1 de
          2 depuis
          1 deux
          2 monde
          1 puits
     
    $


    PS. On peut utiliser "tr" à la place de "sed" : tr ' ' '\n' < plop

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 18
    Par défaut
    Merci beaucoup pour vos réponses, je pense que je vais prendre la solution donnée par zipe31, elle est vachement efficace ^^.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 672
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ cat fichier.txt
    depuis de monde
    deux puits
    mon de puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    time (for ((i=0; i<2000; i++)); do sed 's/ /\n/g' fichier.txt | sort | uniq -c; done)
    []
    real	0m40.027s
    user	0m5.934s
    sys	0m7.727s
    concis, soit. efficace...
    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
    time (
    for ((i=0; i<2000; i++))
    do unset aArr
       declare -A aArr
       for mot in $(<fichier.txt )
       do ((++aArr[$mot]))
       done
       for mot in ${!aArr[@]}
       do printf '%20s :%5d\n' $mot ${aArr[$mot]}
       done
    done
    )
    []
    real	0m7.763s
    user	0m1.270s
    sys	0m0.671s
    je ne suis pas sûr
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 18
    Par défaut
    Soit, je tâcherai à l'avenir de choisir mes mots plus convenablement.

Discussions similaires

  1. Réponses: 5
    Dernier message: 20/01/2014, 16h42
  2. Réponses: 3
    Dernier message: 21/08/2009, 15h16
  3. Nombre de répétition d'un mot dans un fichier texte
    Par heimfield dans le forum Langage
    Réponses: 1
    Dernier message: 28/02/2009, 11h07
  4. Réponses: 5
    Dernier message: 17/02/2008, 12h32
  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