2015-09-07 36 views
3

考慮以下文件和DIFF結果:不一致的等效DIFF結果改變

a1.txt

a 
b 
My name is Ian 

a2.txt

a 
a 
b 
My name is John 

運行diff --side-by-side --suppress-common-lines a1.txt a2.txt產生:

       > a 
My name is Ian    | My name is John 

哪個正確說明a被添加到a2.txtMy name is Ian更改爲My name is John

但是,如果我從兩個文件中刪除b,所產生的結果是不同的:

b1.txt

a 
My name is Ian 

b2.txt

a 
a 
My name is John 

運行diff --side-by-side --suppress-common-lines b1.txt b2.txt產生於:

My name is Ian    | a 
           > My name is John 

這說明線路My name is Ian改爲aMy name is John加入b2.txt

即使第二比較的結果是技術上有效,a1.txta2.txt之間的差異相當於的b1.txtb2.txt,那麼,爲什麼結果不相等?

有什麼我可以做的,第二次比較會產生與第一次相同的輸出嗎?

+1

* [...]爲什麼結果不相等?*您的問題源於diff算法的誤解。 – Jubobs

+0

@Jubobs因爲你似乎比差異算法更瞭解我們,所以請在答案部分給我們一個詳細的答案。將幫助很多 – hazzelnuttie

+0

@Jubobs你可以詳細說明一下嗎?或者你是否僅僅說預期差異解釋等價的變化是不合理的......等價呢? – Ian2thedv

回答

3

您觀察到的兩個示例之間的差異是正常的;它只是與你對diff做什麼的期望相沖突。 diff utility解決longest-common-subsequence problem,使用線作爲單位/原子。

[...] a1.txta2.txt之間的差異相當於的b1.txtb2.txt,那麼,爲什麼結果不相等?

在這裏,你的兩個例子中最長的公共子序列是不同的,大體上說,不會以同樣的方式「排隊」。在第一個例子,你有

# a1.txt    # a2.txt     # line in common? 
         a       n 
a      a       y 
b      b       y 
My name is Ian  My name is John   n 

,而在第二個例子中,你有

# b1.txt    # b2.txt     # line in common? 
a      a       y 
My name is Ian  a       n 
         My name is John   n 

因此,只要diff而言,兩對文件之間的差異是不等價。diff沒有記憶,您所做的只是爲了從a[12].txt文件中刪除b文件中的b[12].txt文件。它所看到的是,現在最長的公共子序列只包含在包含a的一行中,並且它從中推斷出兩個b[12].txt文件之間的差異。

有什麼我可以做的,第二次比較會產生與第一次相同的輸出嗎?

缺乏使用不同的差異算法(或實現自己的),我不這麼認爲。

+1

謝謝您的解釋 – Ian2thedv

+1

感謝:-)回覆 – hazzelnuttie