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


21

Diff是显示两个文件之间的更改的好工具。但是如何显示两个文本文件的相似性(同时忽略差异)呢?

即样本输入:

a:
Foo Bar
X
Hello
World
42

b:
Foo Baz
Hello
World
23

伪输出(类似这样):

@@ 2,3
=Hello World

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

Answers:


24

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

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

2
您可以避免嵌入这样的文字换行符:...%df'$'\n''%<'...
已暂停,直到另行通知。

1
您也可以这样操作:(... --unchanged-group-format="@@ %dn,%df%c'\012'%<" ...请注意双引号。)
已暂停,直到另行通知。

好东西!我不知道这些选项,因为我只是看了diff手册页...
maxschlepzig 2010年

我正在使用diff --version diff(GNU diffutils)2.8.1,并且收到以下错误:diff:冲突的输出样式选项diff:尝试`diff --help'以获得更多信息。
Sujay 2014年

我收到“错误:差异:输出样式选项差异diff”,因为我定义了差异别名。使用which diff看,如果这是你的问题。
justinjhendrick

14
grep -Fxf file1 file2

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


3
-f-F交换吗?至少在我的grep版本中是这样的。我需要为参数提供file2输入-f,例如cat file1 | grep -Fxf file2,然后才能正常工作。
Birei 2012年

这对我不起作用。
Chaminda Bandara

7

comm可以使用。man comm所有选项,但您只想comm -12 ...显示两个输入中都存在的行。

正如人们指出的那样,您需要首先传递您的意见sort


1
嗯,仅适用于两个文件中具有相同行号的公共行。
maxschlepzig 2010年

2
comm似乎仅用于排序的文件,而不能为OP的用例提供有用的输出。他的示例:$ comm -12 ab Hello World通讯:文件1的排序不正确comm:文件2的排序不正确
Marcel Stimberg 2010年

@maxschlepzig:在将文件传递给comm之前,应该对文件进行排序。
Hemant 2010年

2
通过排序,您可以摆脱所有关于公共线位置的信息。您也不会在将文件与diff比较之前对文件进行排序。
Marcel Stimberg,2010年

7

我认为没有一个命令可以执行您想要的操作。不过,您可以尝试合并diffwith 的输出grep。如果您的文本文件包含没有字符|<>,下面给你有些有用的输出:

$ diff --side-by-side a b | grep -n -v "[|<>]"
3:Hello                             Hello
4:World                             World

尝试以下操作:diff --width=155 --left-column --side-by-side a b | grep -n -v '|' | sed 's/ *($//'
暂停,直到另行通知。

看起来更好-但是您必须在grep中包括<和>才能删除两个文件中添加的行。
Marcel Stimberg 2010年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.