AWK计数出现零

时间:2018-04-23 17:51:18

标签: awk

我试图计算列中匹配字符串的出现次数,但想要" 0"当没有匹配时:

柱:

stringone
stringone
stringtwo

和" stringone"," stringtwo"," stringthree"匹配的结果必须是:

stringone 2
stringtwo 1
stringthree 0

我能够获得前两个,芽不知道如何返回" 0":

awk 'match($1,/stringone|stringtwo|stringthree/,b){a[b[0]]++}END{for(i in a)print i ,a[i]}'

3 个答案:

答案 0 :(得分:2)

如果订单不重要

$ awk 'NR==FNR{s[$1]; next} 
              {for(k in s) s[k]+=$0~k} 
           END{for(k in s) print k, s[k]}' search_terms file

stringone 2
stringthree 0
stringtwo 1

提供搜索词作为参数

$ awk -v search='stringone|stringtwo|stringthree' \
    'BEGIN{n=split(search,st,"|")} 
          {for(i=1;i<=n;i++) c[i]+=$0~st[i]} 
     END  {for(i=1;i<=n;i++) print st[i],c[i]}' file

stringone 2
stringtwo 1
stringthree 0

或者

$ for s in string{one,two,three}; do echo -n "$s "; grep -c "$s" file; done

stringone 2
stringtwo 1
stringthree 0

答案 1 :(得分:2)

这样做的缺点是在匹配中使用字符串而不是正则表达式文字。如果你需要挤出每一个性能,你可以复制正则表达式文字中的值,但是你必须非常小心地保持它们的同步。

BEGIN { re = "stringone|stringtwo|stringthree" }

match($1, re, b) { a[b[0]]++ }

END {
    for (i in a) {
        print i, a[i]
    }

    split(re, s, "|")
    for (i in s) {
        if (!(s[i] in a)) {
            print s[i], 0
        }
    }
}

输出:

$ awk -f a.awk file
stringtwo 1
stringone 2
stringthree 0

答案 2 :(得分:0)

如果您的数据位于file1(如上所述)和file2中所需输出顺序中的搜索词:

$ cat file2
stringone
stringtwo
stringthree
你可以:

$ awk 'NR==FNR{a[$1]++;next}{print $1,a[$1]+0}' file1 file2
stringone 2
stringtwo 1
stringthree 0