美文网首页
AWK实现分组

AWK实现分组

作者: 专职掏大粪 | 来源:发表于2020-11-30 16:00 被阅读0次

实现分组计数

cat mem.out |grep Mem:|awk -F ' ' '{print $2}'|sort -r | awk '{count[$1]++;} END { for (i in count) {print i, count[i]}}'

日常部分数据以 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

相关文章

  • AWK实现分组

    实现分组计数 日常部分数据以 txt 的文件格式提供,为避免入库之后再进行统计的麻烦,故学习 shell 进行处理...

  • AWK 入门简明教程

    AWK 脚本的结构 awk 脚本通常由3部分组成。 BEGIN , END 和带模式匹配选项的常见语句块。这3个部...

  • 20170904 awk

    awk介绍awk变量printf命令:实现格式化输出操作符awk patternawk actionawk数组aw...

  • awk巩固扩展

    awk 中使用外部shell变量 选项-v可以实现使用外部变量。 如:A=44echo "ABCD" | awk ...

  • Linux:使用awk进行高级文本处理

    1.awk脚本的基本结构 awk由三部分组成,BEGIN,END,和带模式匹配选项的常见语句块,这三部分都是可选项...

  • Shell编程-获取ping的平均值

    思路说明: 使用ping命令 通过grep命令获取rtt行 然后通过awk命令,使用“/”,进行分组,并获取全部分...

  • MySql笔记——常用命令篇

    mysql 命令 DDL 语句 分组统计进阶 elt + interval 实现分组统计 case when实现分...

  • ios-Predicate介绍

    实现搜索 使用谓词实现分组排序

  • 将list的内容分组(根据实体的属性)

    先整个实体 分组实现

  • 实现分组选择

    前言 如果我们的记录可以划分为一定的分类,每个分类中选取一定量的数据。这样就称为分组选择。如果只是选择最大或者最小...

网友评论

      本文标题:AWK实现分组

      本文链接:https://www.haomeiwen.com/subject/rrarwktx.html