我有一列的8个文件,每列的行数不均匀。我需要确定所有这8个文件中常见的元素。
我可以执行此任务来比较两个文件,但是我无法在shell中编写可行的一个衬里来执行相同操作。
任何想法......
提前谢谢。
档案1
保罗
pawan
档案2
拉曼
保罗
甜的
巴鲁阿
档案3
甜
巴鲁阿
保罗
这三个文件的比较答案应该是保罗。
答案 0 :(得分:7)
以下单行应该做(更改3到8以匹配您的情况)
$ sort * | uniq -c | grep 3
3 Paul
使用sets
...
答案 1 :(得分:4)
python -c 'import sys;print "".join(sorted(set.intersection(*[set(open(a).readlines()) for a in sys.argv[1:]])))' File1 File2 File3
为您的文件Paul
,File1
和File2
打印File3
。
答案 2 :(得分:3)
$ 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'