2017-10-17 45 views
1

Je veux compter le nombre de mots identiques dans un fichier texte et les afficher dans l'ordre décroissant. Jusqu'à présent, j'ont:Bash - Compter le nombre d'occurences dans le fichier texte et l'afficher par ordre décroissant

cat sample.txt | tr ' ' '\n' | sort | uniq -c | sort -nr 

Ce qui est la plupart du temps me donne satisfaction en sortie, sauf le fait qu'il comporte des caractères spéciaux comme des virgules, les points,! et un trait d'union.

Comment puis-je modifier la commande existante pour ne pas inclure les caractères spéciaux mentionnés ci-dessus?

+1

Utilisez 'tr -d' pour supprimer les caractères spéciaux. – Barmar

Répondre

1

Vous pouvez utiliser tr avec une chaîne composite des lettres que vous souhaitez supprimer.

Exemple:

$ echo "abc, def. ghi! boss-man" | tr -d ',.!' 
abc def ghi boss-man 

Ou, utilisez une classe de caractères POSIX sachant que boss-man par exemple deviendrait bossman:

$ echo "abc, def. ghi! boss-man" | tr -d [:punct:] 
abc def ghi bossman 

Side note: Vous pouvez avoir beaucoup plus de contrôle et vitesse en utilisant awk pour cela:

$ echo "one two one! one. oneone 
two two three two-one three" | 
awk 'BEGIN{RS="[^[:alpha:]]"} 
    /[[:alpha:]]/ {seen[$1]++} 
    END{for (e in seen) print seen[e], e}' | 
sort -k1,1nr -k2,2 
4 one 
4 two 
2 three 
1 oneone 
+1

J'aime la solution avec tr -d [: punct:]. Merci. – Wub

+0

Im obtenir la sortie que j'ai voulu mais quand je cours la commande le trait d'union est toujours compté comme champ invisible? Dites que j'ai des occurrences telles que 8 pommes de terre 5 pommes de terre 3 (il compte le trait d'union mais vous ne pouvez pas le voir) dans la ligne de commande – Wub

0

Que diriez-vous les premiers mots avec extraction grep:

grep -o "\w\+" sample.txt | sort | uniq -c | sort -nr