Wie kann man in Linux eine zeilenunabhängige Differenz (Diff) erstellen?

Wie kann man in Linux eine zeilenunabhängige Differenz (Diff) erstellen?

Ich habe zwei Textdateien, bei denen die Zeilenreihenfolge keine Rolle spielt. Ich möchte herausfinden, welche Zeilen in einer Datei anders sind als in der anderen. Die Verwendung von diff in Linux findet die Unterschiede, berücksichtigt aber auch die Änderungen in den Zeilen desselben Textes.

Mit anderen Worten: Wie erstelle ich eine zeilenunabhängige Differenz?

Antwort1

Wenn Ihre Dateien nicht zu groß sind, können Sie sortsie vor diffdem Senden versenden.

So etwas würde also 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)

Antwort2

Ähnlich wie bei den diffOptionen können Sie den commBefehl mit den Prozesssubstitutionen und sort( commerfordert, dass die Dateien, auf die er einwirkt, sortiert sind) verwenden. Dadurch können Sie sich nur auf die gemeinsamen Zeilen konzentrieren, nur auf die Zeilen, die in der einen oder anderen Datei enthalten sind, indem Sie -1Zeilen nur in der ersten Datei unterdrücken, -2Zeilen nur in der zweiten Datei unterdrücken oder -3Zeilen in beiden unterdrücken. Um also alle Zeilen anzuzeigen, die nur in der ersten Datei und nicht in der zweiten Datei enthalten sind, können Sie Folgendes tun:

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

natürlich, wenn Sie möchten, dass Sie auch denken könnten, grepwie

grep -vFxf file2 file1

Dadurch werden die Zeilen als Muster behandelt file2und nur die Zeilen aus Datei1 gedruckt, die keine Übereinstimmungen aufweisen ( -v), während die Zeilen aus ( -f) file2als feste Zeichenfolgen ( -F) behandelt werden, die mit der gesamten Zeile übereinstimmen müssen ( -x).

Die grepLösung hat den Vorteil, dass die Dateien nicht sortiert werden müssen, sondern nur nach Zeilen in einer der Dateien gesucht wird, die in der anderen nicht vorkommen, und nicht in beiden Richtungen gleichzeitig.

verwandte Informationen