Diff是显示两个文件之间的更改的好工具。但是如何显示两个文本文件的相似性(同时忽略差异)呢?
即样本输入:
a:
Foo Bar
X
Hello
World
42
b:
Foo Baz
Hello
World
23
伪输出(类似这样):
@@ 2,3
=Hello World
仅对两个文件进行排序并使用comm是不够的,因为在这种情况下,行信息会丢失。
Diff是显示两个文件之间的更改的好工具。但是如何显示两个文本文件的相似性(同时忽略差异)呢?
即样本输入:
a:
Foo Bar
X
Hello
World
42
b:
Foo Baz
Hello
World
23
伪输出(类似这样):
@@ 2,3
=Hello World
仅对两个文件进行排序并使用comm是不够的,因为在这种情况下,行信息会丢失。
Answers:
即使您不想要差异,如何使用差异?尝试这个:
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
... --unchanged-group-format="@@ %dn,%df%c'\012'%<" ...
请注意双引号。)
which diff
看,如果这是你的问题。
grep -Fxf file1 file2
-F
表示匹配纯字符串(不是正则表达式),-x
表示仅整行匹配,-f
表示从名为其参数的文件中获取“模式”(即行)
-f
和-F
交换吗?至少在我的grep
版本中是这样的。我需要为参数提供file2
输入-f
,例如cat file1 | grep -Fxf file2
,然后才能正常工作。
comm
可以使用。man comm
所有选项,但您只想comm -12 ...
显示两个输入中都存在的行。
正如人们指出的那样,您需要首先传递您的意见sort
。
我认为没有一个命令可以执行您想要的操作。不过,您可以尝试合并diff
with 的输出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/ *($//'
Dick Grune为这类事情写了一系列工具:
http://dickgrune.com/Programs/similarity_tester/
有些版本可以解析各种语言的语法,因此可以将重命名变量之类的内容视为不变。
它similarity-tester
在Debian和Ubuntu中打包。
...%df'$'\n''%<'...