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
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:
sort <file> | uniq -c
Sie können das ausführlichere --countFlag auch mit der GNU-Version verwenden, z. B. unter Linux:
sort <file> | uniq --count
sorterneut verwenden wie:sort <file> | uniq -c | sort -n
Dadurch werden nur doppelte Zeilen mit folgenden Zählwerten gedruckt :
sort FILE | uniq -cd
oder mit langen GNU-Optionen (unter Linux):
sort FILE | uniq --count --repeated
Unter BSD und OSX müssen Sie grep verwenden , um eindeutige Zeilen herauszufiltern:
sort FILE | uniq -c | grep -v '^ *1 '
Für das gegebene Beispiel wäre das Ergebnis:
3 123
2 234
Wenn Sie die Anzahl aller Zeilen drucken möchten, einschließlich der Zeilen , die nur einmal angezeigt werden:
sort FILE | uniq -c
oder mit langen GNU-Optionen (unter Linux):
sort FILE | uniq --count
Für die angegebene Eingabe lautet die Ausgabe:
3 123
2 234
1 345
Um die Ausgabe zu sortieren mit den häufigsten Zeilen oben , können Sie Folgendes tun (um alle Ergebnisse zu erhalten):
sort FILE | uniq -c | sort -nr
oder, um nur doppelte Zeilen zu erhalten, am häufigsten zuerst:
sort FILE | uniq -cd | sort -nr
Unter OSX und BSD wird der letzte:
sort FILE | uniq -c | grep -v '^ *1 ' | sort -nr
| sort -noder | sort -nrzur 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 '
Über awk::
awk '{dups[$1]++} END{for (num in dups) {print num,dups[num]}}' data
Im awk 'dups[$1]++'Befehl enthält die Variable $1den gesamten Inhalt von Spalte1 und eckige Klammern sind Arrayzugriff. Daher wird für jede erste Spalte der Zeile in der dataDatei der Knoten des genannten Arrays dupsinkrementiert.
Und am Ende durchlaufen wir ein dupsArray mit numals Variable und drucken zuerst die gespeicherten Zahlen und dann die Anzahl der duplizierten Werte durch dups[num].
Beachten Sie, dass Ihre Eingabedatei am Ende einiger Zeilen Leerzeichen enthält. Wenn Sie diese löschen, können Sie sie $0anstelle des $1obigen Befehls verwenden :)
uniq?
sort | uniqund 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
Get-Content .\file.txt | Group-Object | Select Name, Count
Wir können auch das Cmdlet where-object verwenden, um das Ergebnis zu filtern
Get-Content .\file.txt | Group-Object | Where-Object { $_.Count -gt 1 } | Select Name, Count
Angenommen, Sie haben Zugriff auf eine Standard-Unix-Shell und / oder eine Cygwin-Umgebung:
tr -s ' ' '\n' < yourfile | sort | uniq -d -c
^--space char
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.