仅在 DIFF 中列出一个文件中的行

jus*_*ime 37 linux diff

我想让 (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
Run Code Online (Sandbox Code Playgroud)

我想diff --someoption diffa.txt diffb.txt生产

    line2 - in a only

    line4 changed
Run Code Online (Sandbox Code Playgroud)

下面的内容看起来应该有帮助,但有点神秘:

   --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
Run Code Online (Sandbox Code Playgroud)

vav*_*ava 50

不确定diff一个人是否可以做到,但您始终可以使用其他 GNU 实用程序的强大功能来帮助您。

diff -u diffa.txt diffb.txt | grep '^-[^-]' | sed 's/^-//'
Run Code Online (Sandbox Code Playgroud)

它执行差异,然后仅选择以“-”开头的行 - 这些行已更改并具有来自 diffa.txt 文件的值,然后sed只需删除那些“-”符号。

编辑:经过几次实验后diff,看起来下面的命令会产生你想要的:

diff --changed-group-format='%<' --unchanged-group-format='' diffa.txt diffb.txt
Run Code Online (Sandbox Code Playgroud)


小智 14

更简单的方法是使用commlinux 实用程序(它需要排序文件进行输入)。它写入标准输出:

  • diffa.txt 唯一的行

  • diffb.txt 唯一的行

  • 常见的线路

并且您可以相应地通过参数 1,2 或 3 抑制它们中的每一个。所以在你的情况下,它看起来像这样:

comm -23 diffa.txt diffb.txt

它抑制对 diffb.txt 唯一的行、常见的行并打印出仅对 diffa.txt 唯一的行

来源:https : //www.tutorialspoint.com/unix_commands/comm.htm


PSc*_*ede 6

我想提一下,comm期望对输入文件进行排序,因此报告的结果与diff.

diff --changed-group-format='%<' --unchanged-group-format='' diffa.txt diffb.txt
Run Code Online (Sandbox Code Playgroud)

是通用的。感谢@vava