diff meldet die gleiche Zeile als unterschiedlich in 2 Dateien

13

Ich habe 2 Dateien mit einer Liste von Songs. hdsongs.txt und sdsongs.txt

Ich habe ein einfaches Skript geschrieben, um alle Songs aufzulisten und in Textdateien auszugeben, um dann ein Diff auszuführen. Es funktioniert größtenteils einwandfrei, aber der tatsächliche diff-Befehl im Skript zeigt dieselbe Zeile als unterschiedlich an. Dies geschieht tatsächlich für mehrere Zeilen, aber nicht für alle.

Hier ist ein Beispiel eines Songs in beiden Dateien:

$ grep Apologize \*songs\*
hdsongs.txt:Timbaland/Apologize.mp3
sdsongs.txt:Timbaland/Apologize.mp3

Es gibt kein abschließendes Sonderzeichen, das ich sehen kann:

$ cat -A hdsongs.txt sdsongs.txt | grep Apologize
Timbaland/Apologize.mp3$
Timbaland/Apologize.mp3$

Wenn ich diff ausführe, wird in jeder Datei dieselbe Zeile angezeigt. aber sind die Zeilen nicht gleich?

$ diff hdsongs.txt sdsongs.txt | grep Apologize
> Timbaland/Apologize.mp3
< Timbaland/Apologize.mp3

Dies ähnelt hier dem Thread: diff meldet, dass sich zwei Dateien unterscheiden, obwohl sie gleich sind!

Dies gilt jedoch für Zeilen innerhalb der Datei, nicht für die gesamte Datei, und die Auflösung dort scheint in diesem Fall nicht zu passen.

$ diff <(cat -A phonesongsonly.txt) <(cat -A passportsongsonly.txt) | grep Apologize
< Timbaland/Apologize.mp3$
> Timbaland/Apologize.mp3$

$ wdiff -w "$(tput bold;tput setaf 1)" -x "$(tput sgr0)" -y "$(tput bold;tput setaf 2)" -z "$(tput sgr0)" hdsongs.txt sdsongs.txt | grep Apologize
>Timbaland/Apologize.mp3
>Timbaland/Apologize.mp3

Weiß jemand, warum Diff die gleiche Zeile zweimal so melden würde?

user1718443
quelle
Vielleicht versuchen Sie es mit hexdumpdiesen beiden Zeilen und sehen, was sich unterscheidet?
user43791

Antworten:

22

Vermutlich haben Sie die Dateien einfach nicht sortiert. Dies ist eines der Verhaltensweisen, die bei unsortierten Eingaben auftreten können:

$ cat file1 
foo
bar
$ cat file2
bar
foo
$ $ diff file1 file2
1d0
< foo
2a2
> foo

Aber wenn Sie sortieren:

$ diff <(sort file1) <(sort file2)
$ 

Das diffProgramm muss Ihnen mitteilen, ob zwei Dateien identisch sind und, falls nicht, wo sie sich unterscheiden. Es ist nicht darauf ausgelegt, Ähnlichkeiten zwischen verschiedenen Zeilen zu finden. Wenn Zeile X der einen Datei nicht mit Zeile X der anderen Datei übereinstimmt, stimmen die Dateien nicht überein. Es spielt keine Rolle, ob sie genau die gleichen Informationen enthalten. Wenn diese Informationen unterschiedlich organisiert sind, werden die Dateien als unterschiedlich gemeldet.

terdon
quelle
3

Da Sie nicht angegeben haben, dass die Dateien sortiert sind, gehe ich davon aus, dass dies nicht der Fall ist. Dies ist die erwartete Ausgabe ab dem diff Zeitpunkt, zu dem eine Zeile in beiden Dateien, jedoch an verschiedenen Orten, angezeigt wird. Dies wäre klar, wenn Sie sich die gesamte diffAusgabe ansehen würden, anstatt sie durchzuleiten grep.

G-Man sagt, "Monica wiedereinsetzen"
quelle
2

Ich würde vorschlagen, etwas wie das hexdiff-Programm zu verwenden, um eine binäre / hexadezimale Ausgabe zu erhalten, da das menschliche Auge nicht immer den Unterschied zwischen den Zeichen erkennen kann, die ein Computer anzeigt, und einige Zeichen möglicherweise nicht angezeigt werden.

Jason Rush
quelle
1
cat -Ahätte die meisten (alle?) Fälle von nicht druckbaren Zeichen gezeigt. Ich bin nicht sicher, wie es mit Unicode-Seltsamkeit umgegangen wäre, aber andere nicht druckbare Zeichen hätten gezeigt werden sollen.
terdon