如何在linux中的两个文件之间获得差异(仅添加)

时间:2013-03-13 12:04:04

标签: linux bash diff

我有两个文件A1和A2(未排序)。 A1是A2的先前版本,并且已将一些行添加到A2。如何获取添加到A2的新行?

注意:我只想添加新行并且不想要A1中但在A2中删除的行。当我做diff A1 A2时,我会得到添加和删除但我只想添加。

请建议一种方法。

7 个答案:

答案 0 :(得分:40)

以下所有内容都是直接从@ TomOnTime的serverfault answer here中复制的:

显示仅存在于文件a中的行:(即从a中删除的内容)

comm -23 a b

显示仅存在于文件b中的行:(即添加到b中的内容)

comm -13 a b

显示仅存在于一个文件或另一个文件中的行:(但不是两者)

comm -3 a b | sed 's/^\t//'

(警告:如果文件a包含以TAB开头的行,则它(第一个TAB)将从输出中删除。)

注意:两个文件都需要排序,以便“comm”正常工作。如果它们尚未排序,则应对它们进行排序:

sort <a >a.sorted
sort <b >b.sorted
comm -12 a.sorted b.sorted

如果文件非常长,这可能是一个很大的负担,因为它需要额外的副本,因此需要两倍的磁盘空间。

编辑:请注意,可以使用进程替换更简洁地编写命令(感谢@phk注释):

comm -12 <(sort < a) <(sort < b)

答案 1 :(得分:38)

diff然后grep获取您想要的编辑类型。

diff -u A1 A2 | grep -E "^\+"

答案 2 :(得分:36)

你可以试试这个

diff --changed-group-format='%>' --unchanged-group-format='' A1 A2

答案 3 :(得分:6)

简单的方法是使用

sdiff A1 A2

另一种方法是使用comm,正如您在Comparing 2 unsorted lists in linux, listing the unique in the second file

中看到的那样

答案 4 :(得分:5)

您可以输入:

grep -v -f A1 A2

答案 5 :(得分:5)

git diff path/file.css | grep -E "^\+" | grep -v '+++ b/' | cut -c 2-
  • grep -E "^\+"来自之前接受的答案,因为保留了非源代码
  • ,因此不完整
  • grep -v '+++ b'删除文件名为更高版本
  • 的非源代码行
  • cut -c 2-删除+个符号列,也可以使用sed 's/^\+//'
由于git,

commsdiff不是一个选项。

答案 6 :(得分:2)

与merp类似的方法,但希望它更易理解且易于调整:

diff \
  --new-line-format="- %L" \
  --old-line-format="" \
  --unchanged-line-format="" \
  A1 A2