如何在Linux中进行单向差异比较?
如何在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机器上确定非操作系统软件包的列表
注意:这与此处提出的问题类似,但并不相同(例如不是重复):
问题的出现原因:
提问者需要在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 }'
)。
以上是对于问题的出现原因以及解决方法的整理。
在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中的行。