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

在 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

我想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

更简单的方法是使用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

答案3

我想提一下,comm需要排序的输入文件,因此报告的结果与不同diff

diff --changed-group-format='%<' --unchanged-group-format='' diffa.txt diffb.txt

是通用的。向@vava 致敬

相关内容