Zählen Sie, wie oft jede Zeile in einer Datei erscheint

23

Angenommen, ich habe eine Datei, die Folgendes enthält:

A
A
A
B
CC

Ich möchte die Ausgabe so haben:

A 3
B 1
CC 1
Cheng
quelle

Antworten:

23

Ich habe es herausgefunden; Eine der uniqOptionen ist -cfür "Präfixzeilen nach Anzahl der Vorkommen":

$ uniq -c
Cheng
quelle
1
Beachten Sie, dass die Zahlen an erster Stelle stehen. Wenn Sie bei der Bestellung pingelig uniq -c filename.txt | sed 's/[^0-9]*\\([0-9]\+\\) \\(.*\\)/\2 \1/'
wären
12
Beachten Sie auch, dass nur benachbarte Wiederholungszeilen gezählt werden. Eine gebräuchliche Redewendung istsort | uniq
Steven D
4
uniq stellt auch die Zählung vor das Datum. Die ursprüngliche Frage würde ungefähr so ​​aussehen: sort filename | uniq -c | awk '{print $ 2, $ 1}'
Bruce Ediger
Falls es aus den obigen Kommentaren nicht klar hervorgeht, müssen Sie sicherstellen, dass die Daten zuerst sortiert werden, um Ihr Ziel zu erreichen. Wenn es nicht sortiert ist, haben Sie wiederholte Eingaben. Zum Beispiel, wenn Ihre ursprüngliche Datei stattdessen war A \ A \ A \ B \ A \ CC, dessen Ausgang nur uniq -czeigen würde A 3und später zeigen A 1. Wenn Sie zuerst
sortieren
16

Ich bin gerade mit einem ähnlichen Problem hergekommen. Daraus habe ich einen etwas fortgeschritteneren Befehl zusammengestellt, von dem ich hoffe, dass er für andere nützlich ist.

Wie Steven D in den obigen Kommentaren sagte, werden uniqnur benachbarte Wiederholungszeilen gezählt, daher müssen Sie die Zeilen zuerst sortieren. Danach finden wir die eindeutigen Zeilen und sortieren sie erneut, sodass die am häufigsten vorkommenden Zeilen oben stehen.

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

Die Ausgabe wird in die Datei umgeleitet output.txt. Wenn Sie die Ergebnisse nur in der Befehlszeile anzeigen möchten, entfernen Sie die Umleitung und ändern Sie den letzten Befehl in, sort -nsodass sich die am häufigsten verwendete Zeile unten befindet, dh definitiv noch auf dem Bildschirm.

Verärgerte Ziege
quelle
4
Sie können cat file.txt | sortmit nur ersetzen sort file.txt. :)
mattdm
1
@mattdm: Der Nachteil dieser Formulierung ist, dass man sie nicht schnell durch catetwas Interessanteres ersetzen kann . Da gibt es ja keine cat.
SamB
1
@SamB Dann schreibe es als < file.txt sort | uniq -c. Dies ist einfach zu bearbeiten und vermeidet dennoch das Unnötige cat.
HDV