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


14

我有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
也许尝试hexdump这两行,看看有什么不同?
user43791

Answers:


24

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

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

但是,如果您进行排序:

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

diff程序的工作是告诉您两个文件是否相同,如果不相同,则区别。它并非旨在查找不同线之间的相似之处。如果一个文件的X行与另一个文件的X行不同,则文件不相同。它们是否包含完全相同的信息无关紧要,如果该信息以不同的方式组织,则文件被报告为不同。


4

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


2

我建议尝试使用诸如hexdiff程序之类的东西来获取二进制/十六进制输出,因为人眼无法始终分辨出计算机显示的字符之间的差异,并且某些字符可能无法显示。


2
cat -A会显示大多数(全部?)非印刷字符的情况。我不确定它将如何处理unicode的奇怪问题,但是应该显示其他非打印字符。
terdon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.