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ürde die Ausgabe folgendermaßen aussehen:
123 3
234 2
345 1
Angenommen, es gibt eine Nummer pro Zeile:
sort <file> | uniq -c
Sie können das ausführlichere --count
-Flag auch mit der GNU -Version verwenden, z. B. unter Linux:
sort <file> | uniq --count
Dadurch werden nur doppelte Zeilen mit folgenden Zählwerten gedruckt:
sort FILE | uniq -cd
oder mit GNU long options (unter Linux):
sort FILE | uniq --count --repeated
on BSD und OSX müssen Sie grep benutzen um einzelne 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 vorkommen:
sort FILE | uniq -c
oder mit GNU long options (unter Linux):
sort FILE | uniq --count
Für die angegebene Eingabe lautet die Ausgabe:
3 123
2 234
1 345
Um die Ausgabe mit den häufigsten Zeilen nach oben zu sortieren , können Sie Folgendes tun (um alle Ergebnisse zu erhalten):
sort FILE | uniq -c | sort -nr
oder, um nur doppelte Zeilen zu erhalten, die häufigsten zuerst:
sort FILE | uniq -cd | sort -nr
unter OSX und BSD wird die letzte:
sort FILE | uniq -c | grep -v '^ *1 ' | sort -nr
Mit dem folgenden Befehl können Sie doppelte Zeilen in mehreren Dateien suchen und zählen:
sort <files> | uniq -c | sort -nr
oder:
cat <files> | sort | uniq -c | sort -nr
Über awk :
awk '{dups[$1]++} END{for (num in dups) {print num,dups[num]}}' data
Im Befehl awk 'dups[$1]++'
enthält die Variable $1
den gesamten Inhalt von Spalte1, und eckige Klammern stehen für den Arrayzugriff. Für jede erste Zeilenspalte in der Datei data
wird der Knoten des Arrays dups
inkrementiert.
Und am Ende durchlaufen wir das Array dups
mit num
als Variable und geben zuerst die gespeicherten Zahlen und dann ihre Nummer aus von doppeltem Wert von dups[num]
.
Beachten Sie, dass Ihre Eingabedatei am Ende einiger Zeilen Leerzeichen enthält. Wenn Sie diese löschen, können Sie $0
anstelle von $1
im obigen Befehl verwenden :)
In Windows mit "Windows PowerShell" Ich habe den folgenden 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 standardmäßige Unix-Shell- und/oder 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.