2011-11-11 27 views
3

我有兩個文件我想與diff比較。改線應該得到一個前綴 「U」,新線 「I」 和刪除的 「d」:Diff和「--GTYPE-group-format」

文件1:

1 
2 
3 
4 
5 

文件2:

1 
2a 
4 
5 
6 

diff --old-group-format="D %<" \ 
--new-group-format="I %>" \ 
--changed-group-format="U %>" \ 
--unchanged-group-format="" file1 file2 

輸出是:

U 2a 
I 6 

但是在哪裏是

D 3 

+0

如果答案解決您的問題,請通過點擊大的複選標記(✓)旁邊接受它。 如果您發現其他答案有幫助,請投票給他們。接受和投票答案不僅有助於回答者,也有助於未來的讀者。請參閱[相關幫助中心文章](http://stackoverflow.com/help/someone-answers)。如果您的問題尚未得到充分解答,請提供反饋。 – mklement0

回答

7

這是差異分組事物的方式。在你changed組,你打印新的變化,而不是舊的,這將是

U 2 
3 

這樣diff的看到分組是:

`1 -> 1` unchanged 
`2,3 -> 2a` changed 
`4,5 -> 4,5` unchanged 
` -> 6` new 

爲了DIFF以A組比賽作爲「老」,前後必須保持不變。所以,如果file2的是這樣的:

1a 
2 
4 
5 
6 

你跑同樣的diff命令,你會得到這樣的:

U 1a 
D 3 
I 6 

因爲有一個2 -> 24 -> 4這是不變的,因此缺少3變分組爲「舊」。

+0

好吧,前後必須保持不變,但我無法控制排序。有沒有另一種方法來獲得結果? – Toru

0

爲了補充Jon Lin's helpful answer

雖然你不能直接使用--<gtype>-group-format選項總是顯示已刪除線(如在Jon的回答解釋),該--side-by-side-y)輸出格式選項確實包含所需的信息,您可以使用awk重新格式化,並根據需要:

diff --suppress-common-lines --side-by-side file1 file2 | 
awk -F'\t+' '$2 ~/+\|/ { print "U " $3 } 
       $2 ~/+</ { print "D " $1 } 
       $2 ~/+>/ { print "I " $3 }' 

與樣品文件這產生了:

U 2a 
D 3 
I 6 

給以下--side-by-side輸出端產生上述awk命令:

2         | 2a 
3         < 
            > 6