Pages : 1
#1 Le 11/02/2019, à 12:02
- Dznet
Le grep me rends fou !!
Bonjour,
Je vais essayer d'être claire dans la description de mon problème.
J'ai un fichier (brut.txt) qui contient des chaînes de caractère, la chaîne n'est pas unique, c'est à dire qu'elle est présente une ou plusieurs fois dans le fichier.
Le but est de compter le nombre de fois la présence de chaque chaîne de caractère dans ce fichier (brut.txt)
Le brut.txt venant de windows, j'ai faite en sort de supprimer les ^M avant.
Mon idée était la suivante:
- J'isole les chaînes de caractère de brut.txt :
cat brut.txt | sort | uniq > source
- je crée un scripte avec une boucle simple qui va me compter le nombre de fois ou une chaîne est présente dans brut.txt
while read chaine reste
do
nbr=$(grep -cx "$chaine" brut.txt)
echo $nbr $chaine >> resultat
done < source
Mais voila, toutes les chaînes ne sortent pas, alors qu'elles sont bien présentes dans les deux fichiers.
Par exemple avec toto
grep -xc toto brut.txt
11
grep -xc toto source
1
grep -xc toto resultat
0
Normalement dans le fichier "resultat" le retour doit être 11.
Je ne comprend pas d’où peut venir le soucis.
Merci de votre aide
Dernière modification par Dznet (Le 11/02/2019, à 14:12)
Hors ligne
#2 Le 11/02/2019, à 12:21
- pingouinux
Re : Le grep me rends fou !!
Bonjour,
Un petite exemple serait bienvenu : fichier de départ + ce que tu obtiens + ce que tu voudrais
Ajouté :
Chaque passage dans la boucle écrase le fichier resultat. Tu peux faire ceci :
while read chaine reste
do
....................................
echo $nbr $chaine
done < source > resultat
Quand tu auras montré un exemple, il sera possible de beaucoup simplifier tes commandes.
Dernière modification par pingouinux (Le 11/02/2019, à 13:12)
Hors ligne
#3 Le 11/02/2019, à 14:06
- Dznet
Re : Le grep me rends fou !!
Alors avec des exemple.
le fichier brut.txt
123456
123456
123456
123456
12345
12345
12345
12345
12345
12345
1234
Aabino
Aabino
acces
création du fichier source à partir de brut.txt avec : cat brut.txt | sort | uniq > source
123456
12345
1234
Aabino
acces
ce que je veux dans le fichier resultat
6 12345
3 123456
2 Aabino
1 1234
1 acces
Par exemple ce que j'obtiens
3 123456
2 Aabino
1 1234
1 acces
le 123456 est absent, alors qu'il est bien présent dans les fichier brut.txt et dans source
Ajout : A oui je ne veux pas écraser le fichier résultat à chaque passage, j'ai corriger dans le premier post.
Dernière modification par Dznet (Le 11/02/2019, à 14:12)
Hors ligne
#4 Le 11/02/2019, à 14:41
- Watael
Re : Le grep me rends fou !!
salut,
ce que tu fais est inutilement compliqué, et donc source d'erreur.
sort brut.txt | uniq -c | sort -rn
et c'est tout !
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#5 Le 11/02/2019, à 17:20
- pingouinux
Re : Le grep me rends fou !!
$ awk '{n[$1]+=1} END{ for(i in n){print n[i],i} }' brut.txt
2 Aabino
1 acces
1 1234
6 12345
4 123456
Hors ligne
#6 Le 11/02/2019, à 18:02
- Dznet
Re : Le grep me rends fou !!
Comme expliqué dans mon premier poste, ce n'est pas vraiment le scripte qui cause problème, même si j'avoue que je me suis compliqué la vie quand je vois vos deux réponses.
Que ce soir avec la solution de Watael ou pingouinux, j'ai toujours le même soucis
J'explique
awk '{n[$1]+=1} END{ for(i in n){print n[i],i} }' brut.txt > resultat
ou
sort brut.txt | uniq -c | sort -rn > resultat
Maintenant, je vérifie à la mano
grep -cx 123456789 brut.txt
79
Donc, le chaine de caractère "123456789" est trouvé 79 fois.
mais quand je fais
grep -cx 123456789 resultat
0
ou (c pareil )
awk '{n[$1]+=1} END{ for(i in n){print n[i],i} }' brut.txt | grep -cx 123456789
0
rien de chez rien, je voudrais comprendre pourquoi
Merci
Dernière modification par Dznet (Le 11/02/2019, à 18:05)
Hors ligne
#7 Le 11/02/2019, à 18:21
- diesel
Re : Le grep me rends fou !!
Ben...,
Faudrait peut-être plutôt faire
grep -cx 123456789 brut.txt > resultat
cat resultat
non ?
Après, que
grep -cx 123456 resultat
te retourne 0, c'est tout à fait normal. Il te suffit de regarder les options de grep pour comprendre (man grep).
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 11/02/2019, à 18:27)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#8 Le 11/02/2019, à 18:28
- Dznet
Re : Le grep me rends fou !!
En fait 123456789 n'est qu'un exemple, regarde mes précédents poste, tu comprendra.
Hors ligne
#9 Le 11/02/2019, à 18:32
- diesel
Re : Le grep me rends fou !!
En fait 123456789 n'est qu'un exemple, regarde mes précédents poste, tu comprendra.
Fais ce que je te recommande et tu comprendras.
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#10 Le 11/02/2019, à 18:36
- pingouinux
Re : Le grep me rends fou !!
awk '{n[$1]+=1} END{ for(i in n){print n[i],i} }' brut.txt | grep -cx 123456789 0
C'est normal, l'option -x de grep cherche une ligne complète. Il faut que tu utilises -w à la place.
grep -cw '123456$' resultat
Hors ligne
#11 Le 11/02/2019, à 18:39
- diesel
Re : Le grep me rends fou !!
Dznet #6 a écrit :awk '{n[$1]+=1} END{ for(i in n){print n[i],i} }' brut.txt | grep -cx 123456789 0
C'est normal, l'option -x de grep cherche une ligne complète. Il faut que tu utilises -w à la place.
grep -cw '123456$' resultat
T'aurais pu le laisser trouver par lui-même.
Proverbe chinois : donne un poisson à un homme, il mangera un jour ; apprend-lui à pêcher, il mangera tous les jours.
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 11/02/2019, à 18:42)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne