Angenommen, ich habe eine Datei ähnlich der folgenden:
123
123
234
234
123
345
Ich möchte herausfinden, wie oft '123' dupliziert wurde, wie oft '234' dupliziert wurde usw. Im Idealfall wäre die Ausgabe also wie folgt:
123 3
234 2
345 1
Antworten:
Angenommen, es gibt eine Nummer pro Zeile:
Sie können das ausführlichere
--count
Flag auch mit der GNU-Version verwenden, z. B. unter Linux:quelle
sort
erneut verwenden wie:sort <file> | uniq -c | sort -n
Dadurch werden nur doppelte Zeilen mit folgenden Zählwerten gedruckt :
oder mit langen GNU-Optionen (unter Linux):
Unter BSD und OSX müssen Sie grep verwenden , um eindeutige Zeilen herauszufiltern:
Für das gegebene Beispiel wäre das Ergebnis:
Wenn Sie die Anzahl aller Zeilen drucken möchten, einschließlich der Zeilen , die nur einmal angezeigt werden:
oder mit langen GNU-Optionen (unter Linux):
Für die angegebene Eingabe lautet die Ausgabe:
Um die Ausgabe zu sortieren mit den häufigsten Zeilen oben , können Sie Folgendes tun (um alle Ergebnisse zu erhalten):
oder, um nur doppelte Zeilen zu erhalten, am häufigsten zuerst:
Unter OSX und BSD wird der letzte:
quelle
| sort -n
oder| sort -nr
zur Pipe wird die Ausgabe nach Wiederholungsanzahl (aufsteigend bzw. absteigend) sortiert. Dies ist nicht das, was Sie fragen, aber ich dachte, es könnte helfen.| awk '$1>100'
sort FILE | uniq -c | grep -v '^ *1 '
Um doppelte Zeilen in mehreren Dateien zu finden und zu zählen, können Sie den folgenden Befehl ausführen:
oder:
quelle
Über awk::
Im
awk 'dups[$1]++'
Befehl enthält die Variable$1
den gesamten Inhalt von Spalte1 und eckige Klammern sind Arrayzugriff. Daher wird für jede erste Spalte der Zeile in derdata
Datei der Knoten des genannten Arraysdups
inkrementiert.Und am Ende durchlaufen wir ein
dups
Array mitnum
als Variable und drucken zuerst die gespeicherten Zahlen und dann die Anzahl der duplizierten Werte durchdups[num]
.Beachten Sie, dass Ihre Eingabedatei am Ende einiger Zeilen Leerzeichen enthält. Wenn Sie diese löschen, können Sie sie
$0
anstelle des$1
obigen Befehls verwenden :)quelle
uniq
?sort | uniq
und die awk-Lösung hat ganz unterschiedliche Leistungs- und Ressourcenkompromisse: Wenn die Dateien groß und die Anzahl der verschiedenen Zeilen klein sind, ist die awk-Lösung viel effizienter. Die Anzahl der Zeilen ist linear, und die Raumnutzung ist in der Anzahl der verschiedenen Zeilen linear. OTOH, die awk-Lösung muss alle verschiedenen Zeilen im Speicher behalten, während (GNU) -Sortierung auf temporäre Dateien zurückgreifen kann.In Windows mit "Windows PowerShell" habe ich den unten genannten Befehl verwendet, um dies zu erreichen
Wir können auch das Cmdlet where-object verwenden, um das Ergebnis zu filtern
quelle
Angenommen, Sie haben Zugriff auf eine Standard-Unix-Shell und / oder eine Cygwin-Umgebung:
Grundsätzlich gilt: Konvertieren Sie alle Leerzeichen in Zeilenumbrüche, sortieren Sie dann die übersetzte Ausgabe und geben Sie diese an uniq weiter und zählen Sie doppelte Zeilen.
quelle