awk如果通过比较两个文本文件列,如果相同则计数器加1

a.txt内容如下:
4567
5566
5566
4567
3465
4567

b.txt内容如下:
5564,a
4567,b
2345,c
3465,d
5566,e

比较a.txt第一列和b.txt中第一列是否相同,如果相同则将b.txt中的第二列次数+1,生成结果
c.txt:
b=3
d=1
e=2

请问如何通过awk工具来实现这个过程?

awk -F '[, ]' 'NR==FNR{dict[$1]++}NR!=FNR{if($1 in dict){print $2"="dict[$1]}}' a.txt b.txt

文件里的每一行最后如果真有空格(估计是打错了。。)就是上面的,没有的话就是下面:

awk -F ',' 'NR==FNR{dict[$1]++}NR!=FNR{if($1 in dict){print $2"="dict[$1]}}' a.txt b.txt
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-01-09
awk -F',' 'NR==FNR{a[$1]++;next}{c[$1]=($1 in a)?a[$1]:0;print $2"= "c[$1]}0' a.txt b.txt追问

大哥你好厉害!!

不好意思啊,实际需求应该是这样,b.txt中第二列的类别可能是相同的,然后输出c.txt中的b=5为a.txt中1111和2222总共出现5次,a=0和c=1也类似这样计算,应该如何改进啊:

a.txt内容如下:
1111
2222
2222
1111
3333
1111
b.txt内容如下:
4444,a
1111,b
5555,a
3333,c
2222,b

生成结果
c.txt:
a=0
b=5c=1

追答

awk -F',' 'NR==FNR{a[$1]++;next}{c[$1]=($1 in a)?a[$1]:0;print $2"= "c[$1]}0' a.txt b.txt |awk -F'=' '{a[$1]+=$2}END {for( i in a ) print i"= " a[i]}' | sort -n > c.txt

awk -F',' 'NR==FNR{a[$0]+=1;next}{for(i in a)if(i==$1){b[$2]+=a[i];delete a[i];break}else{b[$2]=0}}END{for(k in b )print k"="b[k]}' a.txt b.txt

两种方法,你看那个比较顺眼就用那个吧。

本回答被提问者采纳
相似回答