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

Réponses:


23

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

$ uniq -c

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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.