Diff

diff 在 2 個文件中報告相同的行作為不同的行

  • December 15, 2015

我有 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 會像這樣兩次報告同一行?

我的猜測是您根本沒有對文件進行排序。這是您可以在未排序的輸入上獲得的行為之一:

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

但是,如果你排序:

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

diff程序的工作是告訴您兩個文件是否相同,如果不是,它們的不同之處。它並非旨在尋找不同行之間的相似之處。如果一個文件的第 X 行與另一個文件的第 X 行不同,則文件不同。它們是否包含完全相同的資訊並不重要,如果該資訊以不同的方式組織,則文件報告為不同。

引用自:https://unix.stackexchange.com/questions/249394