日常部分数据以 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分组统计功能的更多相关文章

  1. shell学习笔记

    shell学习笔记 .查看/etc/shells,看看有几个可用的Shell . 曾经用过的命令存在.bash_history中,但是~/.bash_history记录的是前一次登录前记录的所有指令, ...

  2. [转帖][Bash Shell] Shell学习笔记

    [Bash Shell] Shell学习笔记 http://www.cnblogs.com/maybe2030/p/5022595.html  阅读目录 编译型语言 解释型语言 5.1 作为可执行程序 ...

  3. shell学习笔记汇总

    1.shell脚本中函数使用 函数定义在前,调用在后,顺序反了就没有效果了.函数调用为:函数名 参数列表 函数内部通过以下变量访问函数的参数:shell脚本函数中: $0: 这个脚本的名字 $n: 这 ...

  4. SHELL学习笔记----IF条件判断,判断条件

    SHELL学习笔记----IF条件判断,判断条件 前言: 无论什么编程语言都离不开条件判断.SHELL也不例外.  if list then           do something here   ...

  5. shell 学习笔记2-shell-test

    一.字符串测试表达式 前面一篇介绍:什么是shell,shell变量请参考: shell 学习笔记1-什么是shell,shell变量 1.字符串测试表达式参数 字符串需要用""引 ...

  6. SHELL学习笔记三

    SHELL学习笔记一 SHELL学习笔记二 SHELL学习笔记三 for 命令 读取列表中的复杂值 从变量读取列表 从命令读取值 更改字段分隔符 用通配符读取目录 which 使用多个测试命令 unt ...

  7. [Bash Shell] Shell学习笔记

    1. Shell简介 Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的.Shell既是一种命令语言,又是一种程序设计语言.作为命 ...

  8. shell 学习笔记1501-1800

    .巧用bash的{}扩展备份目录: cp file.txt{,.bak} .利用at执行一次性命令: echo "ls -l" | at midnight #Execute a c ...

  9. 【转】shell学习笔记(一)——学习目的性、特殊字符、运算符等

    1 学习shell的目的性 写之前我们先来搞清楚为什么要学shell,学习要有目的性 shell简单.灵活.高效,特别适合处理一些系统管理方面的小问题 shell可以实现自动化管理,让系统管理员的工作 ...

随机推荐

  1. PAT 甲级 1062 Talent and Virtue (25 分)(简单,结构体排序)

    1062 Talent and Virtue (25 分)   About 900 years ago, a Chinese philosopher Sima Guang wrote a histor ...

  2. Linux (Ubuntu)安装ssh

    看ssh服务是否启动 打开"终端窗口",输入sudo ps -e |grep ssh 回车有sshd,说明ssh服务已经启动, 如果没有启动,输入sudo service ssh ...

  3. python数据分析数据标准化及离散化详解

    python数据分析数据标准化及离散化详解 本文为大家分享了python数据分析数据标准化及离散化的具体内容,供大家参考,具体内容如下 标准化 1.离差标准化 是对原始数据的线性变换,使结果映射到[0 ...

  4. Unity3D 原来Unity比较新的版本支持中文

    注意: Unity 2018.2 以上版本才可以

  5. 【计算机视觉】纹理特征之LBP局部二值化模式

    转自http://blog.csdn.NET/ty101/article/details/8905394 本文的PDF版本,以及涉及到的所有文献和代码可以到下列地址下载: 1.PDF版本以及文献:ht ...

  6. Netty学习笔记(一)——nio基础

    Netty简单认识: 1) Netty 是由JBOSS 提供的一个Java 开源框架. 2) Netty 是一个异步的.基于事件驱动的网络应用框架,用以快速开发高性能.高可靠性的网络I0 程序. 3) ...

  7. 学习笔记:oracle学习二:oracle11g数据库sql*plus命令之数据库交互、设置运行环境

    目录 1.SQL*PLUS与数据库的交互 2.设置sql*plus运行环境 2.1 set命令简介 2.2 使用set命令设置运行环境 2.2.1 pagesize变量 2.2.2 NEWPAGE变量 ...

  8. Mac配置虚拟环境Virtualenv,安装Python科学计算包详解

    参考: https://www.jianshu.com/p/51140800e8b4 安装 virtualenvwrapper Virtaulenvwrapper是virtualenv的扩展包,可以更 ...

  9. 消息中间件——RocketMQ(一) 环境搭建(完整版)

    每章一点正能量:每当你想要放弃的时候,就想想是为了什么才一路坚持到现在. 前言 最近在回顾复习Java基础中的一些知识点,发现了一些以前见过但是没有留意却特别有意思的知识特性,比如这次想分享的Java ...

  10. 使用google的guova开发高并发下的接口限流

    使用google的guova开发高并发下的接口限流 使用google的guova进行限流 1.guova的限流方式,在定时产生定量的令牌,令牌的数量限制了流量 2.增加一个订单接口限流类OrderRa ...