it-swarm.com.de

Finden Sie doppelte Zeilen in einer Datei und zählen Sie, 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. Im Idealfall würde die Ausgabe folgendermaßen aussehen:

123  3 
234  2 
345  1
465
user839145

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
715
wonk0

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
369
Andrea

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
70
kenorb

Ü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 :)

28
αғsнιη

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
12
vineel

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.

6
Marc B