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

10 浏览
0 Comments

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

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

diff的正常行为:

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

文件A包含:

猫
好狗
一个
二

文件B包含:

猫
一些垃圾
一个
一堆垃圾
我不想知道的东西

如果我按照以下方式进行常规的diff:

diff A B

输出将类似于:

2c2
< 好狗
---
> 一些垃圾
4c4,5
< 二
---
> 一堆垃圾
> 我不想知道的东西

我想要的:

我想要的只是第一部分,例如,我想知道文件A中的所有内容,但不包括文件B中的内容。但是,我希望它忽略文件B中存在但文件A中不存在的一切。

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

???? A B

产生输出:

2c2
< 好狗
4c4,5
< 二

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

编辑:我编辑了示例以解决一行上的多个单词的问题。

注意:这是一个“子问题”:在RedHat Linux机器上确定非操作系统软件包的列表

注意:这与此处提出的问题类似,但并不相同(例如不是重复):

单向diff文件

0
0 Comments

问题的出现原因:

提问者需要在Linux中进行一种单向的diff操作,但是并没有详细说明需要按照什么顺序输出结果,因此对于如何解决这个问题存在一些不确定性。

解决方法:

一种解决方法是使用comm -23 <(sort A) <(sort B)命令。该命令要求输入的文件已经排序过,-2选项表示“不显示第二个文件中独有的行”,-3选项表示“不显示两个文件中共有的行”。这种方法适用于文件中只包含单行实体的情况,并且不要求输出的顺序。

如果需要按照出现的顺序呈现“差异”,可以使用上述diff / awk解决方案(尽管grep部分并不是必需的 - 它可以是diff A B | awk '/^</ { $1 = ""; print }')。

修正:修正了要报告的行集 - 最初我读错了。

文章内容如下:

提问者在Linux中需要进行一种单向的diff操作,但是对于输出结果的顺序并没有做详细说明。根据问题的描述,我们可以给出两种解决方法。

第一种解决方法是使用以下命令:comm -23 <(sort A) <(sort B)。这个命令要求输入的文件已经过排序,-2选项表示“不显示第二个文件中独有的行”,-3选项表示“不显示两个文件中共有的行”。这种方法适用于文件中只包含单行实体的情况,并且不要求输出的顺序。

如果需要按照出现的顺序呈现“差异”,可以使用以下diff / awk解决方案(尽管grep部分并不是必需的 - 它可以是diff A B | awk '/^</ { $1 = ""; print }')。

以上是对于问题的出现原因以及解决方法的整理。

0
0 Comments

在Linux中,如果想要进行单向比较(one way diff),即只输出一个文件中存在而另一个文件中不存在的行,可以使用以下命令:

diff A B | grep '^<'

其中,diff A B用于比较文件A和文件B的差异,grep '^<'表示选择以"<"开头的行,即选择只存在于文件A中的行。

然而,上述命令中的awk '{print $2}'只会选择第二列的内容,在文件A中如果有多个单词,后面的单词会被忽略。为了解决这个问题,可以使用以下命令:

diff A B | grep '^<' | cut -c 3-

其中,cut -c 3-表示选择从第三个字符开始到行末的内容,这样就可以保留所有的单词。

感谢提供这些命令,让我找到了正确的解决方案。通过这个命令,我可以得到我想要的结果,即只输出存在于文件A而不存在于文件B中的行。

0