识别多个文件中的公共元素

时间:2012-01-02 12:13:09

标签: python perl shell

我有一列的8个文件,每列的行数不均匀。我需要确定所有这8个文件中常见的元素。

我可以执行此任务来比较两个文件,但是我无法在shell中编写可行的一个衬里来执行相同操作。

任何想法......

提前谢谢。

档案1
保罗 pawan

档案2
拉曼
保罗
甜的 巴鲁阿

档案3

巴鲁阿
保罗

这三个文件的比较答案应该是保罗。

6 个答案:

答案 0 :(得分:7)

以下单行应该做(更改3到8以匹配您的情况)

$ sort * | uniq -c | grep 3
      3 Paul

使用sets ...

可能更好地在python中执行此操作

答案 1 :(得分:4)

python -c 'import sys;print "".join(sorted(set.intersection(*[set(open(a).readlines()) for a in sys.argv[1:]])))' File1 File2 File3

为您的文件PaulFile1File2打印File3

答案 2 :(得分:3)

的Perl

$ perl -lnE '$c{$_}{$ARGV}++ }{ print for grep { keys %{$c{$_}} == 8 } keys %c;' file[1-8]

应该可以摆脱硬编码8以及@{[ glob "@ARGV" ]},但我现在没有时间对其进行测试。

此解决方案也将正确处理文件中存在的重复行。

答案 3 :(得分:2)

在这里,我一直试图找到一种简洁的方法来确保每个匹配来自不同的文件。如果文件中没有重复项,则在perl中相当简单:

perl -lnwE '$a{$_}++; END { for (keys %a) { print if $a{$_} == 3 } }' files*

-l选项会自动选择您的输入(删除换行符),并为打印添加换行符。这在缺少eof换行符的情况下很重要。

-n选项将读取文件名参数(或标准输入)的输入。

哈希分配将计算重复项,END块将打印出重复项出现3次。将3更改为您拥有的多个文件。

如果您想要一个稍微灵活的版本,可以计算BEGIN块中的参数。

perl -lnwE 'BEGIN { $n = scalar @ARGV } 
    $a{$_}++; END { for (keys %a) { print if $a{$_} == $n } }' files*

答案 4 :(得分:1)

$ awk '++a[$0]==3' file{1..3}.txt
Paul

更新

$ awk '(FILENAME SEP $0) in b{next}; b[FILENAME,$0]=1 && ++a[$0]==3' file{1..3}.txt
Paul

答案 5 :(得分:1)

这可能对您有用:

ls file{1..3} | 
xargs -n1 sort -u | 
sort | 
uniq -c | 
sed 's/^\s*'"$(ls file{1..3} | wc -l)"'\s*//p;d'