我如何在Linux中进行单向差异?

Jon*_*han 5 linux diff command file difference

我如何在Linux中进行单向差异?

diff的正常行为:

通常,diff会告诉您两个文件之间的所有差异.例如,它会告诉您文件A中不在文件B中的任何内容,并且还会告诉您文件B中的所有内容,但不会告诉您文件A中的所有内容.例如:

文件A包含:

cat
good dog
one
two
Run Code Online (Sandbox Code Playgroud)

文件B包含:

cat
some garbage
one
a whole bunch of garbage
something I don't want to know
Run Code Online (Sandbox Code Playgroud)

如果我按如下方式进行常规差异:

差异AB

输出将是这样的:

2c2
< good dog
---
> some garbage
4c4,5
< two
---
> a whole bunch of garbage
> something I don't want to know
Run Code Online (Sandbox Code Playgroud)

我在找什么:

我想要的只是第一部分,例如,我想知道文件A中的所有内容,但不知道文件B中的所有内容.但是,我希望它忽略文件B中的所有内容,但不会忽略文件A中的内容.

我想要的是命令或一系列命令:

???? AB

产生输出:

2c2
< good dog
4c4,5
< two
Run Code Online (Sandbox Code Playgroud)

我相信可以通过将diff的输出管道输入sed或awk来实现解决方案,但我对这些工具不够熟悉,无法提出解决方案.我基本上想要删除所有以---和>开头的行.

编辑:我编辑了示例以说明一行中的多个单词.

注意:这是一个"子问题":确定RedHat Linux机器上安装的非OS软件包列表

注意:这与此处提出的问题类似,但不一样(例如,不是欺骗): 单向差异文件

1''*_*1'' 8

正如评论中所述,一个最正确的答案是

diff A B | grep '^<'
Run Code Online (Sandbox Code Playgroud)

虽然这会给出输出

< good dog
< two
Run Code Online (Sandbox Code Playgroud)

而不是

2c2
< good dog
4c4,5
< two
Run Code Online (Sandbox Code Playgroud)


leo*_*108 5

diff A B|grep '^<'|awk '{print $2}'

grep '^<' 表示选择以 < 开头的行

awk '{print $2}' 表示选择第二列

  • 非常感谢,这让我走上了正轨。print $2 的问题是它忽略了后面出现的任何单词(例如,如果我将“好狗”放入文件 A 与狗中。事实证明,该命令的第一部分实现了我想要的效果,例如以下命令: diff AB | grep '^&lt;' (2认同)
  • @Jonathan 试试这个: diff AB|grep '^&lt;'|cut -c 3- (2认同)

twa*_*erg 5

另一种选择,如果您的文件仅由单行实体组成,并且输出顺序无关紧要(措辞上的问题不清楚),则为:

comm -23 <(sort A) <(sort B)
Run Code Online (Sandbox Code Playgroud)

comm要求对其输入进行排序,并且-2意味着“不要向我显示第二个文件独有的行”,而-3意味着“不要向我显示两个文件之间共有的行”。

但是,如果您需要按“差异”出现的顺序显示“差异”,则上述diff/awk解决方案是可以的(尽管该grep位并不是真正必要的 - 它可能是diff A B | awk '/^</ { $1 = ""; print }'.

编辑:修复了要报告的哪一组行 - 我最初是向后阅读的......