Diff 是一个很好的工具,可以显示两个文件之间的更改。但是如何显示两个文本文件的相似之处(同时忽略差异)?
即样本输入:
a:
Foo Bar
X
Hello
World
42
b:
Foo Baz
Hello
World
23
伪输出(类似这样):
@@ 2,3
=Hello World
仅仅对两个文件进行排序并使用 comm 是不够的,因为在这种情况下行信息会丢失。
答案1
grep -Fxf file1 file2
-F
意味着匹配纯字符串(不是正则表达式),-x
意味着仅整行匹配,-f
意味着从名为其参数的文件中获取“模式”(即行)
答案2
即使您不需要 diff,使用 diff 怎么样?尝试这个:
diff --unchanged-group-format='@@ %dn,%df
%<' --old-group-format='' --new-group-format='' \
--changed-group-format='' a.txt b.txt
这是我从您的示例数据中得到的结果:
$ cat a.txt
Foo Bar
X
Hello
World
42
$ cat b.txt
Foo Baz
Hello
World
23
$ diff --unchanged-group-format='@@ %dn,%df
%<' --old-group-format='' --new-group-format='' \
--changed-group-format='' a.txt b.txt
@@ 2,3
Hello
World
答案3
comm
可以使用。man comm
对于所有选项,但您希望comm -12 ...
仅显示两个输入中都存在的行。
正如人们所指出的,您需要sort
首先传递您的输入。
答案4
Dick Grune 为此类事情编写了一系列工具:
http://dickgrune.com/Programs/similarity_tester/
有一些版本可以解析各种语言的语法,因此可以将重命名变量之类的内容视为未更改。
它的打包方式与similarity-tester
Debian 和 Ubuntu 中的打包方式相同。