输出两个文本文件的公共行(相似性)(diff 的反义词)?

max*_*zig 28 command-line shell diff

Diff 是一个很好的工具来显示两个文件之间的变化。但是如何显示两个文本文件的相似性(同时忽略差异)?

即样本输入:

a:
Foo Bar
X
Hello
World
42

b:
Foo Baz
Hello
World
23
Run Code Online (Sandbox Code Playgroud)

伪输出(类似这样):

@@ 2,3
=Hello World
Run Code Online (Sandbox Code Playgroud)

仅对两个文件进行排序并使用 comm 是不够的,因为在这种情况下,行信息会丢失。

tob*_*ies 25

grep -Fxf file1 file2
Run Code Online (Sandbox Code Playgroud)

-F表示匹配纯字符串(不是正则表达式),-x表示仅整行匹配,-f表示从命名为参数的文件中获取“模式”(即行)


Mik*_*ray 24

即使您不想要差异,如何使用差异?尝试这个:

diff --unchanged-group-format='@@ %dn,%df 
  %<' --old-group-format='' --new-group-format='' \
  --changed-group-format='' a.txt b.txt
Run Code Online (Sandbox Code Playgroud)

这是我从您的示例数据中得到的信息:

$ 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
Run Code Online (Sandbox Code Playgroud)

  • 您可以避免嵌入这样的文字换行符:`...%df'$'\n''%&lt;'...` (2认同)

Oli*_*Oli 10

comm可以使用。man comm对于所有选项,但您希望使用它comm -12 ...来仅显示两个输入中都存在的行。

正如人们所指出的,您需要首先传递您的输入sort

  • 不过,通过排序,您可以摆脱有关公共行位置的所有信息。在将文件与 diff 进行比较之前,您也不会对文件进行排序。 (3认同)
  • comm 似乎仅用于排序的文件,而不是为 OP 的用例提供有用的输出。他的例子: $ comm -12 ab Hello World comm: file 1 is not in sorted order comm: file 2 is not in sorted (2认同)

Mar*_*erg 8

我认为没有一个命令可以执行您希望它执行的操作。不过,您可以尝试将diffwith的输出结合起来grep。如果您的文本文件不包含任何字符|, <, >,则以下内容会为您提供一些有用的输出:

$ diff --side-by-side a b | grep -n -v "[|<>]"
3:Hello                             Hello
4:World                             World
Run Code Online (Sandbox Code Playgroud)