Diff

在差異輸出中獲取正確的行數

  • September 20, 2016

我想在 diff 的輸出中獲得正確的行數(特別是使用-y--suppress-common-lines選項)。使用簡單wc -l不起作用,因為如果兩個文件都沒有換行符結束並且它們的最後一行不同wc -l,則不會計算最後一行。

有沒有簡單有效的解決方案來避免這種情況?

例如,如果您有文件“a”:

a
b
c
d   #no newline here

和“b”:

a
b
c
D    #no newline here

輸出是:

$ diff -y --suppress-common-lines a b | wc -l
0

這顯然是不正確的,因為diff 確實輸出了一行。

沒有換行符,所以wc -l是正確的。相反,您想計算行首的數量。一種方法:

$ diff -y --suppress-common-lines a b | grep '^' | wc -l
1

這不是不正確的。一行必須由一個 LF 字元終止,否則,它不是一行(並且無論如何wc -l都記錄了計算換行符,而不是行)。

您可以將輸出通過管道傳輸到添加缺少的 LF 字元的內容中。GNU粘貼做到了:

$ diff -y --suppress-common-lines <(printf a) <(printf b) | wc -l
0
$ diff -y --suppress-common-lines <(printf a) <(printf b) | paste | wc -l
1

它可能不適用於 paste 的其他實現,但由於您使用的是 GNU 特定選項diff,我們可能可以安全地假設您也有 GNU paste。POSIX 未指定非終止行的文本實用程序的行為。

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