717 Stimmen

Doppelte Zeilen in einer Datei finden und zählen, wie oft jede Zeile dupliziert wurde?

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. Idealerweise würde die Ausgabe also wie folgt aussehen:

123  3 
234  2 
345  1

7 Stimmen

Welche Sprache wollen Sie verwenden?

1016voto

wonk0 Punkte 13011

Angenommen, es gibt eine Nummer pro Zeile:

sort <file> | uniq -c

Sie können die ausführlichere --count Flagge auch mit der GNU-Version, z. B. unter Linux:

sort <file> | uniq --count

3 Stimmen

Dies ist, was ich tun, aber algorithmisch ist dies nicht scheinen, um den effizientesten Ansatz (O(n log n)*avg_line_len, wo n ist die Anzahl der Zeilen) sein. Ich arbeite an Dateien, die mehrere Gigabyte groß sind, daher ist die Leistung ein wichtiges Thema. Ich frage mich, ob es ein Werkzeug gibt, das nur die Zählung in einem einzigen Durchgang durchführt, indem es einen Präfixbaum (in meinem Fall haben Zeichenketten oft gemeinsame Präfixe) oder Ähnliches verwendet, was den Trick in O(n) * avg_line_len erledigen sollte. Kennt jemand ein solches Kommandozeilen-Tool?

33 Stimmen

Ein weiterer Schritt besteht darin, die Ausgabe in einen abschließenden "sort -n"-Befehl zu leiten. Dadurch werden die Ergebnisse danach sortiert, welche Zeilen am häufigsten vorkommen.

127 Stimmen

Wenn Sie nur doppelte Zeilen ausgeben wollen, verwenden Sie 'uniq -d'.

576voto

Andrea Punkte 11428

Dies wird nur doppelte Zeilen drucken mit Zählungen:

sort FILE | uniq -cd

oder mit GNU long Optionen (unter Linux):

sort FILE | uniq --count --repeated

auf 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ürde das Ergebnis lauten:

  3 123
  2 234

Wenn Sie möchten, dass Zählungen für alle Zeilen drucken einschließlich derjenigen, die nur einmal vorkommen:

sort FILE | uniq -c

oder mit GNU long Optionen (unter Linux):

sort FILE | uniq --count

Für die gegebene Eingabe lautet die Ausgabe:

  3 123
  2 234
  1 345

Um die die Ausgabe sortieren mit den am häufigsten vorkommenden Zeilen an der Spitze, können Sie wie folgt vorgehen (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

auf OSX und BSD wird die letzte:

sort FILE | uniq -c | grep -v '^ *1 ' | sort -nr

1 Stimmen

Gutes Argument für die Option --repeated oder -d. So viel genauer als mit "|grep 2" oder ähnlichem!

0 Stimmen

Wie kann ich diesen Befehl ändern, um alle Zeilen abzurufen, deren Wiederholungszahl mehr als 100 beträgt?

0 Stimmen

@Black_Rider Hinzufügen | sort -n o | sort -nr in der Pipe sortiert die Ausgabe nach der Anzahl der Wiederholungen (aufsteigend bzw. absteigend). Dies ist nicht das, was Sie fragen, aber ich dachte, es könnte helfen.

77voto

kenorb Punkte 134883

Um doppelte Zeilen in mehreren Dateien zu finden und zu zählen, können Sie den folgenden Befehl verwenden:

sort <files> | uniq -c | sort -nr

oder:

cat <files> | sort | uniq -c | sort -nr

37voto

αғsнιη Punkte 2264

Über awk :

awk '{dups[$1]++} END{for (num in dups) {print num,dups[num]}}' data

En awk 'dups[$1]++' wird die Variable $1 enthält den gesamten Inhalt von Spalte1, und eckige Klammern bedeuten Array-Zugriff. Also, für jede 1. Spalte der Zeile in data Datei, der Knoten des Arrays namens dups wird inkrementiert.

Und am Ende machen wir eine Schleife über dups Array mit num als Variable und drucken Sie die gespeicherte Zahlen und dann die Anzahl der duplizierten Werte nach dups[num] .

Beachten Sie, dass Ihre Eingabedatei am Ende einiger Zeilen Leerzeichen enthält; wenn Sie diese beseitigen, können Sie mit $0 anstelle von $1 im Befehl oben :)

2 Stimmen

Ist das nicht ein wenig übertrieben, wenn man bedenkt, dass wir uniq ?

14 Stimmen

sort | uniq und die awk-Lösung haben ganz unterschiedliche Leistungs- und Ressourcenkompromisse: Wenn die Dateien groß sind und die Anzahl der verschiedenen Zeilen klein ist, ist die awk-Lösung viel effizienter. Sie ist linear mit der Anzahl der Zeilen und der Platzbedarf ist linear mit der Anzahl der verschiedenen Zeilen. OTOH, die awk-Lösung muß alle verschiedenen Zeilen im Speicher halten, während (GNU) sort auf temporäre Dateien zurückgreifen kann.

19voto

vineel Punkte 3083

Unter Windows mit "Windows PowerShell" Um dies zu erreichen, habe ich den unten genannten Befehl verwendet

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

0 Stimmen

Können Sie alle Vorkommen der Duplikate außer dem letzten löschen, ohne die Sortierreihenfolge der Datei zu ändern?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X