diff 报告同一行与 2 个文件中的不同

use*_*443 14 diff

我有 2 个包含歌曲列表的文件。hdsongs.txt 和 sdsongs.txt

我编写了一个简单的脚本来列出所有歌曲并输出到文本文件,然后对其运行差异。它在大多数情况下都可以正常工作,但脚本中的实际 diff 命令将同一行显示为不同。这实际上发生在多条线路上,但不是全部。

以下是两个文件中歌曲的示例:

$ grep Apologize \*songs\*
hdsongs.txt:Timbaland/Apologize.mp3
sdsongs.txt:Timbaland/Apologize.mp3
Run Code Online (Sandbox Code Playgroud)

没有我可以看到的尾随特殊字符:

$ cat -A hdsongs.txt sdsongs.txt | grep Apologize
Timbaland/Apologize.mp3$
Timbaland/Apologize.mp3$
Run Code Online (Sandbox Code Playgroud)

当我运行 diff 时,它显示每个文件中的同一行;但线条不一样吗?

$ diff hdsongs.txt sdsongs.txt | grep Apologize
> Timbaland/Apologize.mp3
< Timbaland/Apologize.mp3
Run Code Online (Sandbox Code Playgroud)

这类似于这里的线程: diff 报告两个文件不同,尽管它们是相同的!

但这是针对文件中的行,而不是整个文件,并且那里的分辨率似乎不适合这种情况。

$ 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
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么 diff 会像这样报告同一行两次?

ter*_*don 24

我的猜测是您根本没有对文件进行排序。这是您可以在未排序的输入中获得的行为之一:

$ cat file1 
foo
bar
$ cat file2
bar
foo
$ $ diff file1 file2
1d0
< foo
2a2
> foo
Run Code Online (Sandbox Code Playgroud)

但是,如果你排序:

$ diff <(sort file1) <(sort file2)
$ 
Run Code Online (Sandbox Code Playgroud)

diff程序的工作是告诉您两个文件是否相同,如果不同,则说明它们的不同之处。它不是为了找到不同行之间的相似之处。如果一个文件的 X 行与另一个文件的 X 行不同,则文件不相同。它们是否包含完全相同的信息并不重要,如果该信息以不同的方式组织,则文件报告为不同。