我有 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 行不同,则文件不相同。它们是否包含完全相同的信息并不重要,如果该信息以不同的方式组织,则文件报告为不同。