AWK之分组聚合

AWK分组统计功能很强大,我们以下面的数据做几个实验给大家展示一下效果。

[root@localhost wms]# cat groupandsum.txt 
John|P|physics|2|02/12/2002
Rick|L|Mechanical|1|02/12/2002
Jack|T|electrical|3|03/12/2003
Phil|R|Electrucal|1|03/12/2003
Mike|T|mechamical|2|10/12/2003
Paul|R|chemical|2|10/12/2003
John|T|chemical|3|10/12/2002
Tony|N|chemical|2|10/11/2003
James|R|Electrucal|2|10/11/2003

###1. 对所有求和

awk -F '|' '{sum1 += $4} END {print sum1}' groupandsum.txt

分组一般都是用x[$2]=x[$3]…的方式来实现的,其中x[$2]中的$2为要分的组,当然可以多个分组,x[$3]为要处理的值

###2. 分组求和
####一次分组

[root@localhost wms]# awk -F "|" '{x[$5]+=$4} END{for( i in x ){print i,x[i]}}' groupandsum.txt 
03/12/2003 4
02/12/2002 3
10/12/2002 3
10/12/2003 4
10/11/2003 4

####二次分组

[root@localhost wms]# awk -F "|" '{x[$5"-"$3]+=$4} END{for( i in x ){print i,x[i]}}' groupandsum.txt 
10/12/2002-chemical 3
03/12/2003-Electrucal 1
03/12/2003-electrical 3
02/12/2002-Mechanical 1
10/12/2003-mechamical 2
02/12/2002-physics 2
10/11/2003-Electrucal 2
10/11/2003-chemical 2
10/12/2003-chemical 2

###3. 格式化处理

awk -F'|' '{a[$5]+=$4}END{for(i in a)printf("%s\t%d\n",i,a[i])}' groupandsum.txt

###4. 分组求平均值

####对所有求平均:

[root@localhost wms]# awk -F'|' '{sum+=$4} END {print "Average = ", sum/NR}' groupandsum.txt 
Average =  2

####分组求平均:

[root@localhost wms]# awk -F'|' '{a[$5]+=$4;ca[$5]++}END{for(i in a)printf("%s\t%d\taverage:%d\n",i,a[i],a[i]/ca[i])}' groupandsum.txt
03/12/2003      4       average:2
02/12/2002      3       average:1
10/12/2002      3       average:3
10/12/2003      4       average:2
10/11/2003      4       average:2

注意: / 求是整数,% 求余数。其实 / 也能求得完整的值,只是没有显示而已,用%.2f就可以显示了

[root@localhost wms]# awk -F’|’ ‘{a[$5]+=$4;ca[$5]++}END{for(i in a)printf("%s\t%d\t%.2f\n",i,a[i],a[i]/ca[i])}’ groupandsum.txt
03/12/2003 4 2.00
02/12/2002 3 1.50
10/12/2002 3 3.00
10/12/2003 4 2.00
10/11/2003 4 2.00

###5. 分组求最大最小
####- 对所有求最大最小

[root@localhost wms]# awk -F'|' 'BEGIN {max=0}{if($4>max){max=$4}} END{print max}' groupandsum.txt
3

####- 分组求最大最小

[root@localhost wms]# awk -F'|' '{if($4>x[$5]){x[$5]=$4}} END{for (i in x) print i,x[i] }' groupandsum.txt
03/12/2003 3
02/12/2002 2
10/12/2002 3
10/12/2003 2
10/11/2003 2

###6. 分组整理字符

对以数据分类:
a 111
a 222
a 333
b 444
d 555

awk '{x[$1]=x[$1]"\n"$2} END{for( i in x ){print i":", x[i]}}' juhe.txt
a:                                                                         
111                                                                        
222                                                                        
333                                                                        
b:                                                                         
444                                                                        
555 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值