%20erstellen%3F.png)
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 sort
sie vor diff
dem 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 diff
Optionen können Sie den comm
Befehl mit den Prozesssubstitutionen und sort
( comm
erfordert, 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 -1
Zeilen nur in der ersten Datei unterdrücken, -2
Zeilen nur in der zweiten Datei unterdrücken oder -3
Zeilen 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, grep
wie
grep -vFxf file2 file1
Dadurch werden die Zeilen als Muster behandelt file2
und nur die Zeilen aus Datei1 gedruckt, die keine Übereinstimmungen aufweisen ( -v
), während die Zeilen aus ( -f
) file2
als feste Zeichenfolgen ( -F
) behandelt werden, die mit der gesamten Zeile übereinstimmen müssen ( -x
).
Die grep
Lö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.