计算文件中项目的出现次数,将其与另一个文件进行比较?

时间:2013-12-09 10:03:25

标签: bash unix scripting awk

我有两个单列文件。文件1看起来像

red
green
blue 
red
red
green
black

文件1中可能存在重复的样本,但文件2中的项目不会重复。同样,文件2也有列表

red
green

我想计算文件2中的项目出现在文件1中的次数。例如,我想计算文件1中红色和绿色的出现次数。这里的答案是5(3个红色,两个绿色) 我可以从

开始
<file1 cut -d' ' -f1 | uniq -c 

计算每个项目的出现次数,然后使用第二个项目中的列表逐个匹配,但这对于我的文件大小(包含百万行)来说效率很低。

3 个答案:

答案 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 $]