如何显示共同的行(反向差异)?

时间:2009-04-14 05:36:44

标签: command-line diff

我有一系列文本文件,我想知道它们的共同点而不是它们之间不同的行。命令行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(只是一个建议,我真的不在乎语法是什么):

foo:1, bar:3 == linux-vdso.so.1 =>  (0x00007fffccffe000)

感谢。

7 个答案:

答案 0 :(得分:191)

在* 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之前对文件进行排序很重要,如手册页中所述。

答案 1 :(得分:45)

a question listed as a duplicate上找到了这个答案。我发现grep比comm更加管理友好,所以如果你只想要一组匹配的行(例如用于比较CSV),只需使用

grep -F -x -f file1 file2

或简化的fgrep版本

fgrep -xf file1 file2

另外,您可以使用file2*来表示并查找多个文件的共同行,而不只是两个。

其他一些方便的变体包括

  • -n标记以显示每个匹配行的行号
  • -c仅计算匹配的行数
  • -v仅显示不同的文件2 中的行(或使用diff)。

使用comm速度更快,但速度的代价是必须先对文件进行排序。它作为反向差异并非常有用。

答案 2 :(得分:33)

之前被问过:Unix command to find lines common in two files

您也可以尝试使用perl(credit goes here

perl -ne 'print if ($seen{$_} .= @ARGV) =~ /10$/'  file1 file2

答案 3 :(得分:16)

我刚刚从这个线程学习了comm命令,但是想要添加一些额外的东西:如果文件没有排序,并且你不想触摸原始文件,你可以管道sort命令的outptut 。这使原始文件保持不变。在bash中工作,我不能说其他贝壳。

comm -1 -2 <(sort file1) <(sort file2)

这可以扩展为比较命令输出,而不是文件:

comm -1 -2 <(ls /dir1 | sort) <(ls /dir2 | sort)

答案 4 :(得分:5)

最简单的方法是:

awk 'NR==FNR{a[$1]++;next} a[$1] ' file1 file2

无需对文件进行排序。

答案 5 :(得分:1)

仅仅是为了获取信息,我为Windows做了一个小工具,而不是“grep -F -x -f file1 file2”(因为我在Windows上找不到与此命令相同的东西)

这是: http://www.nerdzcore.com/?page=commonlines

用法是“CommonLines inputFile1 inputFile2 outputFile”

源代码也可用(GPL)

答案 6 :(得分:1)

Windows 中,您可以将 Powershell 脚本与 CompareObject 一起使用>

compare-object -IncludeEqual -ExcludeDifferent -PassThru (get-content A.txt) (get-content B.txt)> MATCHING.txt | Out-Null #Find Matching Lines

CompareObject:

  • 不包含-ExcludeDifferent的IncludeEqual:一切
  • 不包含-InclueEqual的ExcludeDifferent:什么都没有