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


34

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

手册页在这些标志上肯定有点简洁!好问题。
quickshiftin

1
我想指出的是,“ info diff”将给出完整的示例,info中包含大量信息。
Baroudi Safwen '16

Answers:


42

不确定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

对于一个脱管方法很好。我更喜欢`perl -ne“ print,如果是s / ^-//”“,那是味道。我想我现在知道我--changed-group-format='%<'在做什么
。...– justintime

谢谢。:DI需要这样的东西来列出两台计算机之间的所有软件包,我使用了sdiff,但这看起来要好一些。
罗布

12

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


我发现这比diff没有按预期做要容易得多。而且我相信它已经预安装在BSD(即Mac OS X)和Ubuntu上,因此没有软件包管理器的噩梦。
Sridhar Sarnobat'5

3

我想提及的是,它comm期望输入文件经过排序,因此报告的结果与有所不同diff

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

是普遍的。感谢@vava

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.