我有 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 程序的东西来获取二进制/十六进制输出,因为人眼不能总是区分计算机显示的字符之间的差异,并且某些字符可能不会显示。