• 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	%d
    ",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]"
    "$2} END {for(i in x){print i ":" x[i]}}' test.txt
    普通:
    3200810
    8075700
    2865288
    超级会员:
    6618151
    8968336
    2545939
    3378244
    3368804
    6655543
    2952781
    
  • 相关阅读:
    hbase过滤器(1)
    公司jar包提交到集群的方法
    hbase Hfile处理原因
    oracle pl/sql远程连接过程
    mapreduce join操作
    HTML不熟悉方法总结
    Ajax详解
    getElementById和querySelector区别
    Session
    ES6模块化
  • 原文地址:https://www.cnblogs.com/hider/p/11834706.html
Copyright © 2020-2023  润新知