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

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

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

我编写了一个简单的脚本来列出所有歌曲并输出到文本文件,然后运行差异。它在大多数情况下工作正常,但脚本中的实际 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 报告两个文件不同,尽管它们是相同的!

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

$ 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 会像这样报告同一行两次?

答案1

我的猜测是您根本没有对文件进行排序。这是未排序输入上可能出现的行为之一:

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

但是,如果你排序:

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

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

答案2

由于您没有说明文件已排序,因此我假设它们没有排序。这是diff 当一行出现在两个文件中但位于不同位置时的预期输出。如果您查看整个diff输出,而不是将其通过管道传输,这一点就会很清楚grep

答案3

我建议尝试使用类似 hexdiff 程序的东西来获取二进制/十六进制输出,因为人眼不能总是区分计算机显示的字符之间的差异,并且某些字符可能不会显示。

相关内容