Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 !!

Dznet a écrit :

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 !!

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

Hors ligne

#11 Le 11/02/2019, à 18:39

diesel

Re : Le grep me rends fou !!

pingouinux a écrit :
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. wink smile

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