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

  1. #1
    Membre à l'essai
    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
    Points : 16
    Points
    16
    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 595
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 595
    Points : 19 477
    Points
    19 477
    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).

  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,

    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 à l'essai
    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
    Points : 16
    Points
    16
    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 595
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 595
    Points : 19 477
    Points
    19 477
    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

  6. #6
    Membre à l'essai
    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
    Points : 16
    Points
    16
    Par défaut
    Soit, je tâcherai à l'avenir de choisir mes mots plus convenablement.

  7. #7
    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
    Comparons ce qui est comparable

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    $ wc -lw < plop 
      206550  2088450
     
    $ cat foo.sh 
    #! /bin/bash
     
    declare -A aArr
    for mot in $(<plop)
    do
    ((++aArr[$mot]))
    done
    for mot in ${!aArr[@]}
    do
    printf '%20s :%5d\n' $mot ${aArr[$mot]}
    done
     
    $ cat bar.sh 
    #! /bin/bash
     
    tr ' ' '\n' < plop | sort | uniq -c
     
     
     
    $ time -p ./foo.sh 
                      un :45900
                    mais :22950
                    deux :22950
                    veut :22950
    [...]
                       y :22950
             associatif, :22950
                   bien, :22950
    real 15.78
    user 15.38
    sys 0.41
     
    $ time -p ./bar.sh 
      68850 
      22950 4,
      22950 a
      45900 à
      22950 accepte,
      22950 amis
    [...]
      22950 y
    real 3.09
    user 3.17
    sys 0.05
     
    $

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 595
    Points : 19 477
    Points
    19 477
    Par défaut
    me voilà rassuré (déçu, mais rassuré) : le jour où le shell est plus rapide que des outils tels que sed, ou awk n'est pas encore arrivé. ouf !

  9. #9
    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
    Me voilà heureux de t'avoir déçu tout en te rassurant

    Au cas ou... Bonne et Heureuse Année 2012, que le Shell soit avec toi

Discussions similaires

  1. Réponses: 5
    Dernier message: 20/01/2014, 17h42
  2. Réponses: 3
    Dernier message: 21/08/2009, 16h16
  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, 12h07
  4. Réponses: 5
    Dernier message: 17/02/2008, 13h32
  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