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

时间:2014-06-24 15:03:49

标签: linux file command diff difference

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

差异的正常行为:

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

文件A包含:

cat
good dog
one
two

文件B包含:

cat
some garbage
one
a whole bunch of garbage
something I don't want to know

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

  

diff A B

输出类似于:

2c2
< good dog
---
> some garbage
4c4,5
< two
---
> a whole bunch of garbage
> something I don't want to know

我在寻找什么:

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

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

???? A B

产生输出:

2c2
< good dog
4c4,5
< two

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

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

注意:这是一个&#34;子问题&#34; of:Determine list of non-OS packages installed on a RedHat Linux machine

注意:这与此处提出的问题类似,但不一样(例如不是欺骗): One-way diff file

4 个答案:

答案 0 :(得分:4)

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

grep '^<'表示选择行以&lt;

开头

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

答案 1 :(得分:2)

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

comm -23 <(sort A) <(sort B)

comm要求对其输入进行排序,-2表示“不向我显示第二个文件唯一的行”,而-3表示“不要” t显示两个文件之间常见的行“。

如果您需要按照它们发生的顺序显示“差异”,上面的diff / awk解决方案是可以的(尽管grep位不是真的必要 - 可能是diff A B | awk '/^</ { $1 = ""; print }'

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

答案 2 :(得分:2)

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

diff A B | grep '^<'

虽然这会给出输出

< good dog
< two

而不是

2c2
< good dog
4c4,5
< two

答案 3 :(得分:1)

如果您还想查看有问题的文件,如果文件夹不同,您可以使用

diff public_html temp_public_html/ | grep '^[^>]'

匹配除以>开头的所有行