我试图计算列中匹配字符串的出现次数,但想要" 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]}'
答案 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