Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/12/2011, 12h28   #1
Invité de passage
 
Inscription : décembre 2011
Messages : 9
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 9
Points : 0
Points : 0
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 :
1
2
3
4
5
Kandro@linux:~$ cat truc
de monde depuis
de
monde
depuis
Lorsque j'exécute le script :

Code :
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 :
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 :
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.
kandro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2011, 12h47   #2
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 072
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 072
Points : 4 155
Points : 4 155
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_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 31/12/2011, 13h07   #3
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,

Code :
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
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 31/12/2011, 13h48   #4
Invité de passage
 
Inscription : décembre 2011
Messages : 9
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 9
Points : 0
Points : 0
Merci beaucoup pour vos réponses, je pense que je vais prendre la solution donnée par zipe31, elle est vachement efficace ^^.
kandro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2011, 13h58   #5
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 072
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 072
Points : 4 155
Points : 4 155
Code :
1
2
3
4
$ cat fichier.txt
depuis de monde
deux puits
mon de puis
Code :
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 :
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_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 31/12/2011, 14h01   #6
Invité de passage
 
Inscription : décembre 2011
Messages : 9
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 9
Points : 0
Points : 0
Soit, je tâcherai à l'avenir de choisir mes mots plus convenablement.
kandro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2011, 14h41   #7
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Comparons ce qui est comparable

Code :
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
 
$
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2011, 15h20   #8
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 072
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 072
Points : 4 155
Points : 4 155
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 !
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2011, 15h32   #9
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
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
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h43.


 
 
 
 
Partenaires

Hébergement Web