我想在 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
做输出一行。
答案1
没有换行符,所以wc -l
是正确的。相反,您想要计算行的开头数。一种方法是:
$ diff -y --suppress-common-lines a b | grep '^' | wc -l
1
答案2
这并没有错。一行必须以 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
它可能不适用于粘贴的其他实现,但由于您使用的是 GNU 特定选项diff
,我们可以安全地假设您paste
也有 GNU。 POSIX 未指定非终止行的文本实用程序的行为。
答案3
正如手册和信息页中所述,-l
( --lines
) 选项似乎用于wc
打印换行符的数量。因此,如果一行不以换行符结尾,则不会增加计数。