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