Wie mache ich einen linienunabhängigen Unterschied (diff) in Linux?

281
pnkjmndhl

Ich habe zwei Textdateien, bei denen die Reihenfolge der Zeilen keine Rolle spielt. Ich möchte die Zeilen herausfinden, die sich in einer Datei von der anderen unterscheiden. Die Verwendung von diff in Linux ermittelt den Unterschied, berücksichtigt aber auch die Änderung in den Zeilen desselben Textes.

Mit anderen Worten: Wie mache ich einen Unterschied, bei dem die Zeilen unempfindlich sind?

0

2 Antworten auf die Frage

5
ace

Wenn Ihre Dateien nicht zu groß sind, können Sie sortsie vor dem diffStart der Datei erstellen .

So etwas würde funktionieren:

sort file1 > file1_sorted sort file2 > file2_sorted diff file1_sorted file2_sorted 

Oder, wie Sie in den Kommentaren erfahren haben, können Sie es auch in einer Zeile tun,

diff <(sort file1) <(sort file2) 
2
Eric Renouf

Ähnlich wie bei den diffOptionen können Sie den commBefehl mit den Prozessersetzungen und verwenden sort( commdie Dateien müssen sortiert werden). Dadurch könnten Sie sich nur auf die gemeinsamen Zeilen konzentrieren, nur auf die Zeilen, die sich in der einen oder anderen -1Datei befinden, indem Sie Zeilen nur in der ersten Datei -2unterdrücken, Zeilen nur in der zweiten Datei -3unterdrücken oder Zeilen in beiden Zeilen unterdrücken Alle Zeilen anzeigen, die nur in der ersten Datei und nicht in der zweiten stehen

comm -23 <(sort file1) <(sort file2) 

natürlich, wenn Sie möchten, dass Sie auch grepgerne verwenden möchten

grep -vFxf file2 file1 

Die Zeilen werden file2als Muster behandelt und nur die Zeilen aus Datei1 gedruckt, die keine Übereinstimmungen ( -v) enthalten, wenn die Zeilen aus ( -f) file2als feste Zeichenfolgen ( -F) behandelt werden, die mit der gesamten Zeile ( -x) übereinstimmen müssen .

Die grepLösung hat den Vorteil, dass die Dateien nicht sortiert werden müssen, sie prüft jedoch nur die Zeilen in einer der Dateien, die sich nicht in der anderen befinden, nicht in beide Richtungen gleichzeitig.

Ich möchte betonen, dass `comm` ** sortierte ** Dateien benötigt. (Ja, Sie erwähnen es indirekt, aber es ist leicht zu übersehen, wie Sie es formuliert haben). Außerdem ist "comm" für dieses Szenario viel effizienter als "diff". Die "grep" -Lösung kann leicht aus dem Speicher ausgehen, wenn "file2" groß ist (exponentielle Ausblendung, wenn der NFA in einen DFA konvertiert wird), wir hatten vor kurzem eine Frage dazu. dirkt vor 5 Jahren 0