如何显示共同线(逆差)?

我有一系列的文本文件,我想知道共同的线条,而不是它们之间不同的线条。 命令行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)