diffは、2つのファイルで同じ行を異なると報告します


13

曲のリストを含む2つのファイルがあります。hdsongs.txtおよびsdsongs.txt

すべての曲とテキストファイルへの出力を一覧表示し、diffを実行する簡単なスクリプトを作成しました。ほとんどの場合は正常に機能しますが、スクリプト内の実際のdiffコマンドは、異なる行と同じ行を表示しています。これは実際には複数の行で発生していますが、すべてではありません。

両方のファイルの歌の例を次に示します。

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

私が見ることができる末尾の特殊文字はありません:

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

diffを実行すると、各ファイルに同じ行が表示されます。しかし、行は同じではありませんか?

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

これはここのスレッドに似ています: diffは2つのファイルが異なることを報告しますが、それらは同じです!

しかし、これはファイル全体ではなくファイル内の行のためであり、その場合の解像度はこの場合に収まらないようです。

$ 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

diffが同じ行をこのように2回報告する理由を誰もが知っていますか?


たぶん、hexdumpこれらの2行を試して、何が違うのか見てみましょう
user43791

回答:


23

私の推測では、単にファイルをソートしていないだけです。これは、ソートされていない入力で取得できる動作の1つです。

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

しかし、並べ替える場合:

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

diffプログラムの仕事は、彼らが異なる場合、ない場合は2つのファイルは、同一であり、かどうかを伝えることです。異なるライン間の類似性を見つけるようには設計されていません。1つのファイルの行Xが他のファイルの行Xと同じでない場合、ファイルは同じではありません。まったく同じ情報が含まれているかどうかは関係ありません。その情報が異なる方法で編成されている場合、ファイルは異なるものとして報告されます。


4

あなたはファイルがソートされていると述べていないので、私はそれらがソートされていないと仮定します。これは、diff 両方のファイルに行が表示されているが、異なる場所にある場合に予想される出力です。これは、diff出力をパイプ処理するのではなく、出力全体を見ると明らかですgrep


2

人間の目はコンピューターが表示する文字の違いを常に認識できず、一部の文字が表示されない場合があるため、hexdiffプログラムのようなものを使用してバイナリ/ 16進出力を取得することをお勧めします。


2
cat -A非印刷文字のほとんど(すべて?)のケースが表示されます。ユニコードの奇妙さをどのように処理したかはわかりませんが、他の非印刷文字が表示されるはずです。
テルドン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.