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

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

曲のリストを含む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線と異なる場合、ファイルは同じではありません。同じ情報が含まれているかどうかは重要ではありません。その情報が異なる方法で構成されている場合、ファイルは別々に報告されます。

おすすめ記事