Shell学习笔记:awk实现group by分组统计功能
Posted 小刀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell学习笔记:awk实现group by分组统计功能相关的知识,希望对你有一定的参考价值。
日常部分数据以 txt 的文件格式提供,为避免入库之后再进行统计的麻烦,故学习 shell 进行处理,减少工作量。
1.样例数据
# test.txt
YD5Gxxx|6618151|6825449073|6476534190|36251|超级会员|0
YD5Gxxx|8968336|1445546463|6476534190|36251|超级会员|0
YD5Gxxx|2545939|6904742993|0858636804|36251|超级会员|80%以上
YD5Gxxx|3200810|6896525523|6501574903|36251|普通|0
YD5Gxxx|3378244|6926264463|6519442719|36251|超级会员|80%以上
YD5Gxxx|8075700|6854827783|0858523344|36251|普通|80%以上
YD5Gxxx|3368804|6934387193|0000487348|36251|超级会员|(0,50%]
YD5Gxxx|2865288|6865082233|0859114957|36251|普通|(0,50%]
YD5Gxxx|6655543|6930124273|6521876215|36251|超级会员|(0,50%]
YD5Gxxx|2952781|6820973583|0858704189|36251|超级会员|0
2.一些普通操作
通过 awk -F
可以实现按分隔符进行切割操作,再通过 print $6
可以输出字段。
sort
进行排序,uniq
进行去重操作,wc -l
进行计数操作。
cat test.txt | awk -F \'|\' \'print $6\' | sort
普通
普通
普通
超级会员
超级会员
超级会员
超级会员
超级会员
超级会员
超级会员
cat test.txt | awk -F \'|\' \'print $6\' | sort | uniq
普通
超级会员
cat test.txt | awk -F \'|\' \'print $6\' | sort | uniq | wc -l
2
也可以通过 grep
进行查找,然后再进行下一步操作,例如重定向到另一个新的文件。
cat test.txt | grep \'超级会员\' | awk -F \'|\' \'print $2\' > super_user.txt
通过 split -l
对文件进行切分。
split -l 5 super_user.txt
# 每5行切分为一个文件
3.分组统计
[$6]
实现分组,count[$6]++
实现计数。
awk -F \'|\' \'count[$6]++; END for(i in count) print i count[i]\' test.txt
普通3
超级会员7
根据第7列进行筛选之后,再按第6列进行分组统计。
awk -F \'|\' \'if($7=="0") count[$6]++; END for(i in count) print i count[i]\' test.txt
普通1
超级会员3
4.分组求和
对所有进行求和。
awk -F \'|\' \'sum += $2 END print sum\' test.txt
# 48629596
分组一般使用x[$2]=x[$3]的方式来实现,其中x[$2]中的$2为要分的组,可以多个分组,x[$3]为要处理的值。
一次分组
awk -F \'|\' \'x[$6] += $2 END for(i in x)print i, x[i]\' test.txt
普通 14141798
超级会员 34487798
二次分组
awk -F \'|\' \'x[$6"-"$7] += $2 END for(i in x)print i, x[i]\' test.txt
超级会员-80%以上 5924183
超级会员-0 18539268
普通-(0,50%] 2865288
超级会员-(0,50%] 10024347
普通-0 3200810
普通-80%以上 8075700
格式化处理
awk -F \'|\' \'x[$6] += $2 END for(i in x)print("%s\\t%d\\n",i,x[i])\' test.txt
# 显示的格式有点不对劲
分组求平均值
awk -F \'|\' \'sum += $2 END print "Average = ", sum/NR\' test.txt
# Average = 4.86296e+06
awk -F \'|\' \'a[$6] += $2; ca[$6]++ END for(i in a)print(i,a[i]/ca[i])\' test.txt
# 普通 4.71393e+06
# 超级会员 4.92683e+06
分组求最大最小
awk -F \'|\' \'BEGIN max=0 if($2>max)max=$2 END print max\' test.txt
# 最大值
awk -F \'|\' \'if($2>x[$6])x[$6]=$2 END for(i in x) print i, x[i]\' test.txt
# 普通 8075700
# 超级会员 8968336
分组整理字符
awk -F \'|\' \'x[$6]=x[$6]"\\n"$2 END for(i in x)print i ":" x[i]\' test.txt
普通:
3200810
8075700
2865288
超级会员:
6618151
8968336
2545939
3378244
3368804
6655543
2952781
以上是关于Shell学习笔记:awk实现group by分组统计功能的主要内容,如果未能解决你的问题,请参考以下文章
Java操作Elasticsearch6实现group by分组查询