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可以实现自动化管理,让系统管理员的工作 ...
随机推荐
- SQL-W3School-函数:SQL 函数
ylbtech-SQL-W3School-函数:SQL 函数 1.返回顶部 1. SQL 拥有很多可用于计数和计算的内建函数. 函数的语法 内建 SQL 函数的语法是: SELECT function ...
- 快速查看MySQL数据库的版本号
1.利用dos命令连接数据库后即有版本号信息 2.利用navicat连接mysql的客户端工具也是可以查看的 直接选中一个连接,然后右键-连接信息查看 3.利用专门的mysql命令查看 4.直接查看咱 ...
- 阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_17-课程预览功能开发-前后端测试
启动前端代码 前端课程找到课程的发布页面 这样就打开了预览页面 结束
- Django之中间件、缓存以及信号
Django之中间件 中间件执行流程 我们从浏览器发出一个请求 Request,得到一个响应后的内容 HttpResponse ,这个请求传递到 Django的过程如下: 也就是说,每一个请求都是先通 ...
- Django之form表单验证顺序
概述 django框架提供了一个forms类,来处理web开发中的表单相关事项.众所周知,form最常做的是对用户输入的内容进行验证,为此django的forms类提供了全面的内容验证支持. 验证过程 ...
- vue-cli 引入stylus报错
在App.vue页面添加以下代码报错: <style lang="stylus" rel="stylesheet/stylus"> </sty ...
- 【python比较两个列表list】 python2 cmp() python3 operator模块
https://www.yiibai.com/python/list_cmp.html 如果元素的类型相同,则执行比较并返回结果.如果元素是不同的类型,则检查它们是否是数字. 如果数字,必要时进行数字 ...
- 关于VS2010工程各种路径注意事项汇总
关于VS2010工程各种路径注意事项汇总 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:前段时间调试,利用cmake生成的vs2010工程文件,虽然该 ...
- 教你成为全栈工程师(Full Stack Developer) 四十五-一文读懂hadoop、hbase、hive、spark分布式系统架构
转载自http://www.shareditor.com/blogshow?blogId=96 机器学习.数据挖掘等各种大数据处理都离不开各种开源分布式系统,hadoop用于分布式存储和map-red ...
- hupu面试
1.mybatis更新一条数据时,如果某字段为空,则不更新它,使用默认值? <update id="updateProduct" parameterType="Pr ...