Unix-Befehl, um zu überprüfen, ob zwei Zeilen in einer Datei identisch sind?


24

Gibt es einen Unix-Befehl, mit dem überprüft werden kann, ob zwei Zeilen in einer Datei identisch sind?

Zum Beispiel Betrachten Sie eine Datei sentences.txt

This is sentence X
This is sentence Y
This is sentence Z
This is sentence X
This is sentence A
This is sentence B

Wir sehen, dass der Satz

This is sentence X

wird wiederholt.

Gibt es einen Befehl, der dies schnell erkennt, so dass ich ihn vielleicht so ausführen kann?

$ cat sentences.txt | thecommand
Line 1:This is sentence X
Line 4:This is sentence X

Antworten:


40

Hier ist eine Möglichkeit, genau die Ausgabe zu erhalten, die Sie suchen:

$ grep -nFx "$(sort sentences.txt | uniq -d)" sentences.txt 
1:This is sentence X
4:This is sentence X

Erläuterung:

In der inneren $(sort sentences.txt | uniq -d)Liste ist jede Zeile aufgeführt, die mehr als einmal vorkommt. Der äußere Teil grep -nFxsucht erneut sentences.txtnach genauen -xÜbereinstimmungen mit einer dieser Zeilen -Fund stellt deren Zeilennummer voran-n


Ihre Bearbeitung hat mich kaum geschlagen, da ich genau dieselbe Antwort gepostet habe. +1
casey

Die Syntax $ (Befehl) fungiert also als eine Art Ersatz?
CodeBlue

2
@CodeBlue - ja. Es heißt Command Substitution
grebneke

8
sort sentences.txt | uniq -d | grep -nFxf - sentences.txtwäre ein wenig effizienter und würde potenzielle arg list too longProbleme vermeiden .
Stéphane Chazelas

10

Nicht genau das, was Sie wollen, aber Sie können versuchen, zu kombinieren sortund uniq -c -d:

aularon@aularon-laptop:~$ cat input
This is sentence X
This is sentence Y
This is sentence Z
This is sentence X
This is sentence A
This is sentence B

aularon@aularon-laptop:~$ sort input | uniq -cd
      2 This is sentence X
aularon@aularon-laptop:~$ 

2Hier ist die Anzahl der gefundenen Duplikate für die Zeile man uniq:

   -c, --count
          prefix lines by the number of occurrences

   -d, --repeated
          only print duplicate lines

6

WENN der Dateiinhalt in den Speicher passt, awkist dies gut. Der Standard-Einzeiler in comp.lang.awk (ich kann keine Instanz von diesem Computer aus durchsuchen, aber es gibt jeden Monat mehrere), um zu erkennen, dass es Duplikate gibt awk 'n[$0]++', zählt die Vorkommen der einzelnen Zeilenwerte und gibt alle Vorkommen aus. andere als die erste, da die Standardaktion ist print $0.

Das Anzeigen aller Vorkommen, einschließlich des ersten, in Ihrem Format, aber möglicherweise in gemischter Reihenfolge, wenn mehr als ein Wert dupliziert wird, ist etwas komplizierter:

awk <sentences.txt ' !($0 in n) {n[$0]=NR;next} \
    n[$0] {n[$0]=0; print "Line "n[$0]":"$0} \
    {print "Line "NR":"$0} '

Aus Gründen der Übersichtlichkeit werden Sie in der Regel in mehreren Zeilen zusammen ausgeführt. Wenn Sie dies häufig tun, können Sie das awkSkript in eine Datei mit awk -foder natürlich das Ganze in ein Shell-Skript einfügen. Wie die meisten einfachen awkkann dies sehr ähnlich mit gemacht werden perl -n[a].

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.