使用命令行获取两个文件之间的交集

使用命令行获取两个文件之间的交集

获取两个文件之间交集的最有效方法是什么?有:

sort file1 file2 | uniq -d

答案1

使用grep命令行如下:

grep -Fx -f file1 file2

答案2

如果要合并两个文件的内容,请运行以下命令,

awk 'NR==FNR' file1 file2

答案3

假设 file1 = 'A\nA' 且 file2 = 'A\nA\nA'。交集只是 'A' 还是 'A\nA'?换句话说,同一行在两个文件中出现的次数是否相关?


如果只是“A”,这将有效:

sort <(sort file1 | uniq) <(sort file2 | uniq) | uniq -d

问题中给出的方法的问题是,即使两个文件中都不存在某一行,如果在其中一个文件中重复,它也会出现在结果中。因此,我们需要先使用 删除文件内的重复项sort fileX | uniq


如果是“A\nA”,那么这将起作用:

sort <(sort file1 | awk '{if ($0 == prev) c++; else c=0; print c, $0; prev = $0;}') <(sort file2 | awk '{if ($0 == prev) c++; else c=0; print c, $0; prev = $0;}') | uniq -d | cut -d' ' -f2-

我可以想到更多单行代码(使用 awk、sort、uniq 和 cut),但没有一个比这个更简单。当然,这并不意味着没有更简单的解决方案。

相关内容