我有两个文件A1和A2(未排序)。A1是A2的早期版本,A2中添加了一些行。如何获取添加到A2的新行?注意:我只想添加新的行,不想在A1,但在A2删除的行。当我执行diff A1 A2时,我得到了添加和删除,但我只需要添加。请提出一个方法来做到这一点。
diff A1 A2
wnrlj8wa1#
下面的大部分内容直接从@TomOnTime的serverfault答案here复制而来。在底部是一个尝试,工作在未排序的文件,但该命令排序的文件之前,给予的差异,所以在许多情况下,它不会是什么是理想的。对于未排序文件的格式良好的差异,您可能会发现其他答案更有用(感谢@Fritz指出这一点):显示仅存在于文件a中的行:(即从a中删除的内容)
comm -23 a b
字符串显示只存在于文件B中的行:(即添加到B中的内容)
comm -13 a b
型显示只存在于一个文件或另一个文件中的行:(但不是两者)
comm -3 a b | sed 's/^\t//'
型(警告:如果文件a包含以TAB开头的行,则它(第一个TAB)将从输出中删除。)注意:两个文件都需要排序,“comm”才能正常工作。如果它们还没有排序,你应该对它们进行排序:
a
sort <a >a.sorted sort <b >b.sorted comm -12 a.sorted b.sorted
型如果文件非常长,这可能是一个相当大的负担,因为它需要额外的副本,因此需要两倍的磁盘空间。编辑:注意,使用进程替换可以更简洁地编写命令(感谢@phk的评论):
comm -12 <(sort < a) <(sort < b)
型
5hcedyr02#
diff,然后grep作为所需的编辑类型。
diff
grep
diff -u A1 A2 | grep -E "^\+"
字符串
im9ewurl3#
你可以试试这个
diff --changed-group-format='%>' --unchanged-group-format='' A1 A2
字符串这些选项记录在man diff中:
man diff
--GTYPE-group-format=GFMT format GTYPE input groups with GFMT
型以及:
LTYPE is 'old', 'new', or 'unchanged'. GTYPE is LTYPE or 'changed'.
GFMT (only) may contain: %< lines from FILE1 %> lines from FILE2 [...]
2cmtqfgy4#
类似于https://stackoverflow.com/a/15385080/337172的方法,但希望更容易理解和调整:
diff \ --new-line-format="%L" \ --old-line-format="" \ --unchanged-line-format="" \ A1 A2
lo8azlld5#
您可以键入:
grep -v -f A1 A2
v2g6jxz66#
git diff path/file.css | grep -E "^\+" | grep -v '+++ b/' | cut -c 2-
grep -E "^\+"
grep -v '+++ b'
cut -c 2-
+
sed 's/^\+//'
comm或sdiff由于git的原因而无法使用。
comm
sdiff
2guxujil7#
简单的方法是用途:
sdiff A1 A2
字符串另一种方法是使用comm,如您在Comparing two unsorted lists in linux, listing the unique in the second file中所见
sdnqo3pr8#
您可以只过滤需要添加到fileA以使其等于fileB的行。我们包括第一行,它指示要应用更改的行号。
fileA
fileB
diff $fileA $fileB | grep '^>' -B 1
8条答案
按热度按时间wnrlj8wa1#
下面的大部分内容直接从@TomOnTime的serverfault答案here复制而来。在底部是一个尝试,工作在未排序的文件,但该命令排序的文件之前,给予的差异,所以在许多情况下,它不会是什么是理想的。对于未排序文件的格式良好的差异,您可能会发现其他答案更有用(感谢@Fritz指出这一点):
显示仅存在于文件a中的行:(即从a中删除的内容)
字符串
显示只存在于文件B中的行:(即添加到B中的内容)
型
显示只存在于一个文件或另一个文件中的行:(但不是两者)
型
(警告:如果文件
a
包含以TAB开头的行,则它(第一个TAB)将从输出中删除。)注意:两个文件都需要排序,“comm”才能正常工作。如果它们还没有排序,你应该对它们进行排序:
型
如果文件非常长,这可能是一个相当大的负担,因为它需要额外的副本,因此需要两倍的磁盘空间。
编辑:注意,使用进程替换可以更简洁地编写命令(感谢@phk的评论):
型
5hcedyr02#
diff
,然后grep
作为所需的编辑类型。字符串
im9ewurl3#
你可以试试这个
字符串
这些选项记录在
man diff
中:型
以及:
型
以及:
型
2cmtqfgy4#
类似于https://stackoverflow.com/a/15385080/337172的方法,但希望更容易理解和调整:
字符串
lo8azlld5#
您可以键入:
字符串
v2g6jxz66#
字符串
grep -E "^\+"
来自先前接受的答案,它是不完整的,因为留下了非源代码的内容grep -v '+++ b'
删除文件名为更高版本的非源代码行cut -c 2-
删除+
符号列,也可以使用sed 's/^\+//'
comm
或sdiff
由于git的原因而无法使用。2guxujil7#
简单的方法是用途:
字符串
另一种方法是使用
comm
,如您在Comparing two unsorted lists in linux, listing the unique in the second file中所见sdnqo3pr8#
您可以只过滤需要添加到
fileA
以使其等于fileB
的行。我们包括第一行,它指示要应用更改的行号。字符串