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分组统计功能的更多相关文章
- shell学习笔记
shell学习笔记 .查看/etc/shells,看看有几个可用的Shell . 曾经用过的命令存在.bash_history中,但是~/.bash_history记录的是前一次登录前记录的所有指令, ...
- [转帖][Bash Shell] Shell学习笔记
[Bash Shell] Shell学习笔记 http://www.cnblogs.com/maybe2030/p/5022595.html 阅读目录 编译型语言 解释型语言 5.1 作为可执行程序 ...
- shell学习笔记汇总
1.shell脚本中函数使用 函数定义在前,调用在后,顺序反了就没有效果了.函数调用为:函数名 参数列表 函数内部通过以下变量访问函数的参数:shell脚本函数中: $0: 这个脚本的名字 $n: 这 ...
- SHELL学习笔记----IF条件判断,判断条件
SHELL学习笔记----IF条件判断,判断条件 前言: 无论什么编程语言都离不开条件判断.SHELL也不例外. if list then do something here ...
- shell 学习笔记2-shell-test
一.字符串测试表达式 前面一篇介绍:什么是shell,shell变量请参考: shell 学习笔记1-什么是shell,shell变量 1.字符串测试表达式参数 字符串需要用""引 ...
- SHELL学习笔记三
SHELL学习笔记一 SHELL学习笔记二 SHELL学习笔记三 for 命令 读取列表中的复杂值 从变量读取列表 从命令读取值 更改字段分隔符 用通配符读取目录 which 使用多个测试命令 unt ...
- [Bash Shell] Shell学习笔记
1. Shell简介 Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的.Shell既是一种命令语言,又是一种程序设计语言.作为命 ...
- shell 学习笔记1501-1800
.巧用bash的{}扩展备份目录: cp file.txt{,.bak} .利用at执行一次性命令: echo "ls -l" | at midnight #Execute a c ...
- 【转】shell学习笔记(一)——学习目的性、特殊字符、运算符等
1 学习shell的目的性 写之前我们先来搞清楚为什么要学shell,学习要有目的性 shell简单.灵活.高效,特别适合处理一些系统管理方面的小问题 shell可以实现自动化管理,让系统管理员的工作 ...
随机推荐
- new Handler()和new Handler(Looper.getMainLooper())的区别是什么?
new Handler()和new Handler(Looper.getMainLooper())的区别是什么? 一.Handler的一些知识,new Handler()和new Handle ...
- It’s worth noting值得注意的是
It’s worth noting that in JavaScript applications the Model is often connected via Ajax to a back-en ...
- osg::NodeVisitor example
[0]osg::Group [1]osg::MatrixTransform [1] osg::MatrixTransform [1]osg::MatrixTransform [2] osg::Geod ...
- 服务器(三):利用github的webhooks实现自动部署
实现自动部署的关键就是利用github的webhooks,我们在github建立一个项目之后,在项目主页点击Settings,看到Webhooks点击打开可以添加一个链接,这里的意思是,github可 ...
- CentOS7下JSP连接Mysql
实验环境如下: youxi1 CentOS7.5 Tomcat8.5.35 192.168.5.101 youxi2 CentOS7.5 Mysql5.7.20 192.168.5.102 (1).下 ...
- Mysql视图介绍
视图是一个存在于数据库中的虚拟表.视图本身没有数据,只是通过执行相应的select语句完成获得相应的数据.可以理解为select语句的别名. (1).视图的作用 1.如果某个查询结果出现的非常频繁,即 ...
- 利用python批量修改word文件名的方法示例
利用python批量修改word文件名的方法示例 最近不小心把硬盘给格式化了,由于当时的文件没有备份,所以一下所有的文件都没有了,于是只能采取补救措施,用文件恢复软件恢复了一部分的数据出来,但是恢复完 ...
- react——Table组件列中靠左 靠右对齐解决方案
最近项目中遇到一个需求调整:table中的文字过长居左排列,数字居右排列 然后看了一下官方文档: 先上图展示一下 左边是需要的效果: className: 'column-left', { title ...
- D-Link系列路由器漏洞挖掘
参考 http://www.freebuf.com/articles/terminal/153176.html https://paper.seebug.org/429/ http://www.s3c ...
- 【c# 学习笔记】继承
在c#中,一个类可以继承另外一个已有的类(密封类除外),被继承的类称为基类(或父类),继承的类称为派生类(或子类),子类将获得基类 除构造函数和析构函数以外的所有成员.此外,静态类是密封的,也不能被继 ...