我想让 (GNU)DIFF 只打印出一个文件中不同的行。因此
==> diffa.txt <==
line1
line2 - in a only
line3
line4 changed
line5
==> diffb.txt <==
line1
line3
line4 changed in b
line5
line6 in b only
我想diff --someoption diffa.txt diffb.txt
制作
line2 - in a only
line4 changed
以下内容看上去似乎有帮助,但却有点神秘:
--GTYPE-group-format=GFMT
Similar, but format GTYPE input groups with GFMT.
--line-format=LFMT
Similar, but format all input lines with LFMT.
--LTYPE-line-format=LFMT
Similar, but format LTYPE input lines with LFMT.
LTYPE is `old', `new', or `unchanged'.
GTYPE is LTYPE or `changed'.
GFMT may contain:
%< lines from FILE1
%> lines from FILE2
答案1
不确定diff
自己能否做到这一点,但您可以随时使用其他 GNU 实用程序的功能来帮助您。
diff -u diffa.txt diffb.txt | grep '^-[^-]' | sed 's/^-//'
它进行差异分析,然后仅选择以“-”开头的行 - 这些行已更改且具有来自 diffa.txt 文件的值,然后sed
只需删除这些“-”符号。
编辑:经过几次实验后diff
,看起来以下命令产生了您想要的结果:
diff --changed-group-format='%<' --unchanged-group-format='' diffa.txt diffb.txt
答案2
更简单的方法是使用comm
Linux 实用程序(它需要排序的文件作为输入)。它写入标准输出:
diffa.txt 特有的行
diffb.txt 特有的行
常见的线条
并且您可以相应地通过参数 1、2 或 3 来抑制它们中的每一个。因此,在您的例子中,它将如下所示:
comm -23 diffa.txt diffb.txt
它会抑制 diffb.txt 中特有的行和常见的行,并打印出仅对 diffa.txt 特有的行
答案3
我想提一下,comm
需要排序的输入文件,因此报告的结果与不同diff
。
diff --changed-group-format='%<' --unchanged-group-format='' diffa.txt diffb.txt
是通用的。向@vava 致敬