比较两个文件并在最后附加差异

时间:2019-07-22 17:10:43

标签: bash shell unix

我想比较两个文件,例如file1file2,并输出两个新文件,例如file1.outfile2.out,它们具有相同的行(根据diff file1 file2)首先出现,然后在file1的末尾附加file2中不在file1.out中的行,以及{{1}中的行},但不在file2末尾附加的file1中。

例如,假设我有file2.out

file1

A B C E

file2

我想将A C D E AC的常见行按原始顺序排在修改后的文件Efile1.out中,分别将file2.outB这两个不同的行移到末尾。以我的示例为例,它将产生D

file1.out

A C E B

file2.out

更一般地说,我的输入文件可能包含成千上万行,几乎都是相同的,有些分散的差异我想在末尾推送以便于进行直观检查。

我已经查看了相关类型的查询,例如此处(Compare two files line by line and generate the difference in another file),但在这里找不到我想要的解决方案。如果您知道如何如上所述生成输出,将不胜感激。

1 个答案:

答案 0 :(得分:2)

我认为您可以使用diff -U <large number>解决此问题。这将为您提供易于解析的输出,以重建您想要的内容。如果<large number>大于两个文件中的较长文件,那么您将获得可预测的输出格式:

$diff -u 1000 file1 file2
--- file1       2019-07-22 14:39:39.344674000 -0400
+++ file2       2019-07-22 14:39:45.072654000 -0400
@@ -1,4 +1,4 @@
 0.0000000000000000  0.0000000000000000  0.5000000000000000
+0.2500000000000000  0.7500000000000000  0.7500000000000000
 0.7500000000000000  0.7500000000000000  0.7500000000000000
-0.0000000000000000  0.5000000000000000  0.2500000000000000
 0.0000000000000000  0.0000000000000000  0.0000000000000000

然后,您可以使用grep和sed重构所需的两个输出文件:

diff -u 1000 file1 file2 | sed '1,3d' > tmp
grep '^ ' tmp | sed 's/^ //' > file1.out
cp file1.out file2.out
grep '^-' tmp | sed 's/^-//' >> file1.out
grep '^+' tmp | sed 's/^+//' >> file2.out

注意:

  • sed '1,3d'仅删除diff输出的前三行,因为它们不存在。我以前在这里有tail +3,但是不太方便携带; sed更安全。
  • 第一个grep提取共同的行(以diff中的空格开头)。
  • 接下来的两次抓取提取行并不相同(-仅在file1中,+仅在file2中)。
  • 如果file1file2相同,则会产生空的输出文件。