曲のリストを含む2つのファイルがあります。 hdsongs.txtとsdsongs.txt
すべての曲を一覧表示してテキストファイルに出力し、diffを実行する簡単なスクリプトを作成しました。ほとんどの場合、うまく機能しますが、スクリプトの実際のdiffコマンドは同じ行と異なる行を表示します。これは実際には複数行で発生しますが、すべてではありません。
以下は、2つのファイルの曲の例です。
$ 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回報告するのかを知っている人はいますか?
答え1
私の考えでは、ファイルをまったく並べ替えていないようです。これは、ソートされていない入力で可能な動作の1つです。
$ cat file1
foo
bar
$ cat file2
bar
foo
$ $ diff file1 file2
1d0
< foo
2a2
> foo
しかし、ソートすると、次のようになります。
$ diff <(sort file1) <(sort file2)
$
プログラムdiff
の使命は、2つのファイルが同じかどうか、そうでない場合はどう違うかを教えることです。これは、異なる製品ライン間の類似点を見つけるために設計されていません。あるファイルのX線が他のファイルのX線と異なる場合、ファイルは同じではありません。同じ情報が含まれているかどうかは重要ではありません。その情報が異なる方法で構成されている場合、ファイルは別々に報告されます。
答え2
ファイルがソートされたとは言わなかったので、ソートされていないと仮定します。これはdiff
、1 行が 2 つのファイルにあるが別の場所に表示される場合に予想される出力です。 .diff
grep
答え3
人間の目はコンピュータに表示される文字間の違いを常に区別できず、一部の文字が表示されない場合があるため、hexdiffプログラムなどのプログラムを使用してバイナリ/16進出力を取得することをお勧めします。