如何显示共同线(逆差)?
我有一系列的文本文件,我想知道共同的线条,而不是它们之间不同的线条。 命令行unix或windows是好的。
FOO:
linux-vdso.so.1 => (0x00007fffccffe000) libvlc.so.2 => /usr/lib/libvlc.so.2 (0x00007f0dc4b0b000) libvlccore.so.0 => /usr/lib/libvlccore.so.0 (0x00007f0dc483f000) libc.so.6 => /lib/libc.so.6 (0x00007f0dc44cd000)
酒吧:
libkdeui.so.5 => /usr/lib/libkdeui.so.5 (0x00007f716ae22000) libkio.so.5 => /usr/lib/libkio.so.5 (0x00007f716a96d000) linux-vdso.so.1 => (0x00007fffccffe000)
所以,给出这两个文件上面的输出所需的实用程序将类似于file1:line_number, file2:line_number == matching text
(只是一个build议,我真的不在乎什么语法):
foo:1, bar:3 == linux-vdso.so.1 => (0x00007fffccffe000)
谢谢。
在* nix上,你可以使用comm 。 这个问题的答案是:
comm -1 -2 file1.sorted file2.sorted # where file1 and file2 are sorted and piped into *.sorted
以下是comm
的完整用法:
comm [-1] [-2] [-3 ] file1 file2 -1 Suppress the output column of lines unique to file1. -2 Suppress the output column of lines unique to file2. -3 Suppress the output column of lines duplicated in file1 and file2.
另外请注意,在使用comm之前对文件进行sorting非常重要,正如手册页所述。
之前在这里被问到:用Unix命令查找两个文件中常见的行
你也可以试试perl(信贷在这里 )
perl -ne 'print if ($seen{$_} .= @ARGV) =~ /10$/' file1 file2
在列出的重复问题上find这个答案。 我发现grep比comm更好pipe理,所以如果你只是想要一组匹配的行(比如用于比较CSV),简单的使用
grep -F -x -f file1 file2
或简化的fgrep版本
fgrep -xf file1 file2
另外,您可以使用file2*
来查找与多个文件相同的行,而不仅仅是两行。
一些其他方便的变化包括
-
-n
标志显示每个匹配行的行号 -
-c
只计算匹配的行数 -
-v
只显示file2中不同的行(或使用diff
)。
使用comm
速度更快,但速度是以不得不先sorting文件为代价的。 作为“逆向差异”并不是很有用。
我刚刚从这个线程学到了comm命令,但是想要添加一些额外的东西:如果文件没有sorting,而且你不想触摸原始文件,你可以通过pipe道输出sort命令。 这使原始文件保持不变。 在bash中工作,我不能说其他的炮弹。
comm -1 -2 <(sort file1) <(sort file2)
这可以扩展到比较命令输出,而不是文件:
comm -1 -2 <(ls /dir1 | sort) <(ls /dir2 | sort)
最简单的方法是:
awk 'NR==FNR{a[$1]++;next} a[$1] ' file1 file2
文件不需要sorting。
只是为了提供信息,我做了一个Windows工具,它的function与“grep -F -x -f file1 file2”相同(因为我没有在Windows上find和这个命令相同的东西)
这里是: http : //www.nerdzcore.com/?page=commonlines
用法是“CommonLines inputFile1 inputFile2 outputFile”
源代码也可用(GPL)