我想比较两个文件,例如file1
和file2
,并输出两个新文件,例如file1.out
和file2.out
,它们具有相同的行(根据diff file1 file2
)首先出现,然后在file1
的末尾附加file2
中不在file1.out
中的行,以及{{1}中的行},但不在file2
末尾附加的file1
中。
例如,假设我有file2.out
:
file1
和A
B
C
E
:
file2
我想将A
C
D
E
,A
和C
的常见行按原始顺序排在修改后的文件E
和file1.out
中,分别将file2.out
和B
这两个不同的行移到末尾。以我的示例为例,它将产生D
:
file1.out
和A
C
E
B
:
file2.out
更一般地说,我的输入文件可能包含成千上万行,几乎都是相同的,有些分散的差异我想在末尾推送以便于进行直观检查。
我已经查看了相关类型的查询,例如此处(Compare two files line by line and generate the difference in another file),但在这里找不到我想要的解决方案。如果您知道如何如上所述生成输出,将不胜感激。
答案 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更安全。-
仅在file1
中,+
仅在file2
中)。file1
和file2
相同,则会产生空的输出文件。