AWK统计不同列的数据

点击量:288

今天QA妹子在做数据查询的时候向我抱怨,说我们开发打的日志太不规范,导致她查询数据时相当麻烦,数据的原始格式是这样的:

1844#雄霸四方#freePhantomNum:89,armyGold:280,num:1,gold:2800,type:1
1844#雄霸四方#freePhantomNum:88,armyGold:280,num:1,gold:2800,type:1
1844#雄霸四方#freePhantomNum:87,armyGold:280,num:1,gold:2800,type:1
92673#汔丶淚。#freePhantomNum:101,armyGold:280,num:1,gold:2800,type:1
4391#曹操之后#freePhantomNum:81,num:1,armyGold:280,gold:2800,type:1
4391#曹操之后#freePhantomNum:80,num:1,armyGold:280,gold:2800,type:1
4391#曹操之后#freePhantomNum:79,num:1,armyGold:280,gold:2800,type:1
4391#曹操之后#freePhantomNum:78,num:1,armyGold:280,gold:2800,type:1

妹子的需求是这样的:统一每个玩家num这一项累计之和。
首先说下这个日志确实不规范,因为参数的顺序不统一,比如num在gold之前,也会在armyGold之前,比较混乱。而且也不应该把数据代表含义的字符串打出来,虽然好看但不便于脚本统计数据,比如freePhantomNum:89,只要输出89就可以了。
妹子让我帮她写一下,我对AWK也不是特别熟。首先把格式整一整,把#全部替换成,这样就方便操作了,替换后的格式是这样的:
 
1844,雄霸四方,freePhantomNum:89,armyGold:280,num:1,gold:2800,type:1
1844,雄霸四方,freePhantomNum:88,armyGold:280,num:1,gold:2800,type:1
1844,雄霸四方,freePhantomNum:87,armyGold:280,num:1,gold:2800,type:1
92673,汔丶淚。,freePhantomNum:101,armyGold:280,num:1,gold:2800,type:1
4391,曹操之后,freePhantomNum:81,num:1,armyGold:280,gold:2800,type:1
4391,曹操之后,freePhantomNum:80,num:1,armyGold:280,gold:2800,type:1
4391,曹操之后,freePhantomNum:79,num:1,armyGold:280,gold:2800,type:1
4391,曹操之后,freePhantomNum:78,num:1,armyGold:280,gold:2800,type:1
 
观察日志发现num的位置只会出现在第5位或者第4位(awk以逗号分隔),那其实只要判断这两种情况就行了。判断好了之后发现还有一个问题,元素num:1要进行二次加工才能得到这个数量。不知道awk是否有这个功能,网上一查有一个split方法,非常好。于是就写出了下面这样的脚本:
 
awk -F ‘,’ ‘{if($5 ~/num/) {split($5,b,”:”);a[$2]+=b[2]}if($4 ~/num/) {split($4,c,”:”);a[$2]+=c[2]}} END{for(i in a) print i, a[i]}’ src.txt
输出的结果是:
雄霸四方 3
曹操之后 4
汔丶淚。 1
 
这样就统计出来了,换成正式数据结果也是准确的,问题解决。
主要是下面几个知识点:
1.awk判断字符串匹配
2.awk split函数的使用

发表评论

电子邮件地址不会被公开。 必填项已用*标注