我有两个单列文件。文件1看起来像
red
green
blue
red
red
green
black
文件1中可能存在重复的样本,但文件2中的项目不会重复。同样,文件2也有列表
red
green
我想计算文件2中的项目出现在文件1中的次数。例如,我想计算文件1中红色和绿色的出现次数。这里的答案是5(3个红色,两个绿色) 我可以从
开始<file1 cut -d' ' -f1 | uniq -c
计算每个项目的出现次数,然后使用第二个项目中的列表逐个匹配,但这对于我的文件大小(包含百万行)来说效率很低。
答案 0 :(得分:2)
如果你想计算总数,请:
$ grep -cf file2 file1
5
grep -c
代表count
和-f
“从FILE获取模式,每行一个”。
一步一步:
$ grep -f file2 file1
red
green
red
red
green
$ grep -cf file2 file1
5
如果你想得到多少,请:
$ awk 'NR==FNR {a[$1]=$1; next} {if (a[$1]) b[$1]++} END {for (i in b) print i, b[i]}' file2 file1
green 2
red 3
NR==FNR {a[$1]=$1; next}
从第一个文件中获取信息,获取可能的值。{if (a[$1]) b[$1]++}
,如果第一列位于可能值的数组中,则增加一个数组计数器b[]
。END {for (i in b) print i, b[i]}
打印结果。答案 1 :(得分:2)
另一个awk
变体
awk 'NR==FNR {a[$1]++;next} a[$1] {b[$1]++} END {for (i in b) print i,b[i]}' file2 file1
red 3
green 2
答案 2 :(得分:2)
我有与fedorqui和Jotne相同的基本想法,但我只使用一个数组。对于非常大的密钥文件,这可能会更好,因此我将其包含在内以便完整(我还将其写为文件,而不是单行文件):
#!/usr/bin/awk -f
FNR==NR{
# this is the key file:
KEYS[$1]=0;
next ;
}
{
if($1 in KEYS){
KEYS[$1]++;
}
}
END{
for(i in KEYS){
print i " " KEYS[i]
}
}
[count_occurrences.awk $] ./co.awk f2.dat f1.dat
red 3
green 2
[count_occurrences.awk $]