長い1行ファイルでdiffを使用する

長い1行ファイルでdiffを使用する

1 行だけのファイルがあります。サイズは約 20,000 バイトです。

ファイルが変更されたので、どこが変更されたのかを知りたいです。

diff を使用することを考えましたが、差分のある行を出力するため、完全な行が表示されます。ただし、この場合は、ファイル内で差分があるのは 1 行だけです。

それで、その違いが何なのか知りたかったのです。

何かアドバイス?

答え1

通常のテキストと同様に空白が多数あると仮定すると、ファイルを単語ごとに分割し、通常の diff ツール (たとえば、meld) を使用して比較できます。

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

答え2

行内差分をとるdiffを探します。私はxxディフUNIX上ではウィンマージWindows 上で行内差分を実行します。

他の回答も同様に適切です: wdiff、またはチャンクに分割 - データがパイプやカンマなどで区切られている場合、チャンクの境界を定義しやすくなります。

答え3

これが一度限りの問題であれば、50 文字ごとに文字を挿入したファイルのコピーを作成し\n、それらのコピーを比較します。(50 を選択したのは、元のファイルの異なる行番号からバイト オフセットまでの計算が簡単になるためですが、結果に基づいて上下に調整する可能性があります。)

答え4

私はgit diff--word-diff=porcelainこのようなタスクにオプションが役立つことを発見しました。たとえば、1 文字だけ異なる長い行を持つ 2 つのファイルがある場合、出力を でパイプしてgrep変更された行と変更をフィルターし、grepもう一度 でパイプして各行の最後の 80 文字のみを表示できます。

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

関連情報