Verwenden von Diff auf einer langen einzeiligen Datei

Verwenden von Diff auf einer langen einzeiligen Datei

Ich habe eine Datei mit nur einer Zeile. Sie ist etwa 20.000 Byte groß.

Die Datei wurde geändert und ich wollte wissen, wo.

Ich dachte, ich verwende „diff“, aber es zeigt mir die komplette Zeile, weil es die Zeile mit dem Unterschied ausgibt – in diesem Fall ist es jedoch die einzige Zeile in der Datei, die Unterschiede aufweist.

Also wollte ich sehen, was der Unterschied ist.

Irgendein Rat?

Antwort1

Vorausgesetzt, es sind viele Leerzeichen vorhanden, wie in normalem Text, können Sie die Datei nach Wörtern aufteilen und mit einem normalen Diff-Tool vergleichen, zum Beispiel meld:

tr -s ' ' '\n' < file1.txt > file1.txt.split
tr -s ' ' '\n' < file2.txt > file2.txt.split
meld file1.txt.split file2.txt.split

Antwort2

Ich würde einen Diff finden, der Intra-Line-Diffs macht. Ich benutzexxunterschiedunter UNIX. Ich denkeWinMergegibt es unter Windows Intra-Line-Diffs.

Die anderen Antworten sind auch gut: wdiff oder Aufteilen in Blöcke – die Blockgrenzen lassen sich leichter definieren, wenn die Daten beispielsweise durch ein Pipe-Zeichen oder ein Komma abgegrenzt werden.

Antwort3

Wenn dies ein einmaliges Problem ist, würde ich Kopien der Dateien erstellen, in die \nalle 50 Zeichen Zeichen eingefügt werden, und dann diese Kopien vergleichen. (Ich habe 50 gewählt, da dies die Berechnung vereinfacht, wenn man von unterschiedlichen Zeilennummern zu Byte-Offsets in den Originaldateien übergeht, aber ich könnte das basierend auf meinen Ergebnissen nach oben oder unten anpassen.)

Antwort4

Ich fand git diffdie --word-diff=porcelainOption für eine solche Aufgabe hilfreich. Wenn zum Beispiel 2 Dateien mit langen Zeilen vorliegen, die sich nur um 1 Zeichen unterscheiden, kann die Ausgabe über weitergeleitet werden, grepum die geänderten Zeilen und Änderungen herauszufiltern, und dann grepnoch einmal über, um nur die letzten 80 Zeichen jeder Zeile anzuzeigen:

echo {1..4000} A {4001..8000} > a.tmp
echo {1..4000} B {4001..8000} > b.tmp

> git diff -U0 --word-diff=porcelain a.tmp b.tmp | grep -A3 '@@' | egrep -o '.{1,80}$'
@@ -1 +1 @@
3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000
-A
+B

verwandte Informationen