Comptez combien de fois chaque ligne apparaît dans un fichier

23

Disons que j'ai un fichier qui contient:

A
A
A
B
CC

Je veux avoir la sortie comme ceci:

A 3
B 1
CC 1
Cheng
la source

Réponses:

23

Je l'ai compris; une des uniqoptions est -c, pour "préfixer les lignes par le nombre d'occurrences":

$ uniq -c
Cheng
la source
1
Notez que les chiffres passent en premier. Si vous étiez pointilleux à propos de la commande, vous pourriez faire:uniq -c filename.txt | sed 's/[^0-9]*\\([0-9]\+\\) \\(.*\\)/\2 \1/'
frabjous le
12
Notez également qu'il ne compte que les lignes de répétition adjacentes. Un idiome commun estsort | uniq
Steven D
4
uniq place également le décompte devant la donnée. La question d'origine aurait en fait besoin de quelque chose comme ceci: sort filename | uniq -c | awk '{print $ 2, $ 1}'
Bruce Ediger
Dans le cas où cela ne ressort pas clairement des commentaires ci-dessus, vous devez vous assurer que les données sont d'abord triées pour atteindre votre objectif. S'il n'est pas trié, vous aurez des entrées répétées. Par exemple, si votre fichier d'origine était à la place A \ A \ A \ B \ A \ CC, la sortie de juste uniq -cs'afficherait A 3et s'afficherait plus tard A 1. Le tri en premier garantira que toutes les lignes identiques sont regroupées
drootang
16

Je viens de venir ici avec un problème similaire. De là, j'ai réussi à mettre sur pied une commande légèrement plus avancée, qui, je l'espère, est utile pour les autres.

Comme Steven D l'a dit dans les commentaires ci-dessus uniqne compte que les lignes de répétition adjacentes, vous devez donc d'abord trier les lignes. Après cela, nous trouvons les lignes uniques, puis trions à nouveau afin que les lignes les plus fréquentes soient au sommet.

sort file.txt | uniq -c | sort -nr > output.txt

La sortie est redirigée vers le fichier output.txt. Si vous souhaitez simplement afficher les résultats sur la ligne de commande, supprimez la redirection et changez la dernière commande en sort -nafin que la ligne la plus courante soit en bas, c'est-à-dire définitivement toujours à l'écran.

Chèvre mécontente
la source
4
Vous pouvez remplacer cat file.txt | sortpar juste sort file.txt. :)
mattdm
1
@mattdm: l'inconvénient de cette formulation est que vous ne pouvez pas remplacer rapidement le catpar quelque chose de plus intéressant. Depuis, vous savez, il n'y en a pas cat.
SamB
1
@SamB Ensuite, écrivez-le comme < file.txt sort | uniq -c. Ceci est facile à modifier et évite tout de même l'inutile cat.
DVD