输出两个文本文件的公共行(相似之处)(与 diff 相反)?

输出两个文本文件的公共行(相似之处)(与 diff 相反)?

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-testerDebian 和 Ubuntu 中的打包方式相同。

相关内容