1. 导读
1.1 阅读提示
- 阅读对象: 初级数据分析师 + shell有点了解
- 阅读时间: 15分钟
- 难易程度: 中等
- 使用频率: 高频
- 练习环境: linux
1.2 内容简介
awk是一个强大的文本处理语言,用于数据处理和统计。数据分析师应该get到它,会严重提高自己的数据处理效率。如果文件超过Exce处理能力,因为希望立刻得到基本统计信息,来不及或不想投入一定时间写python或其他程序处理,那么用awk就太赞了, 可轻松对几百万甚至几千万行数据进行处理,秒级别出结果。
1.3 练习环境
如果本地只有Windows环境,没有安装Linux环境,可以连接我已经在云端建好的环境,按大白话shell命令系列: 阿里云端Linux环境篇 一步步来就中。
练习数据云端路径:/home/dataworker/data/userprofile.csv
本文所有命令演示,基于该数据,一共13行,实际上单机处理几百万上千万文本是没有问题的, 这里仅为方便演示
学校,sex,age,city
北大,男,20,北京
北大,男,21,北京
北大,男,20,北京
北大,男,21,北京
北大,男,20,北京
南大,男,21,北京
南大,女,20,上海
南大,女,21,上海
南大,女,20,上海
南大,女,21,上海
南大,女,20,上海
南大,女,21,上海
2. 统计场景
awk的好处是,直接对文本进行处理,不依赖数据库。下面列出常用数据处理的场景,分别写出awk和等效sql,加深印象。
先简单介绍awk命令模式:
awk '{正则+处理逻辑}' '文件名'
举个例子:
2.1 列选择
- 选择第2,4列
# awk
awk -F',' '{print $2,$4}' userprofile.csv
# sql
select sex, city from user_table
2.2 行选择
- 选择2-5行
# awk
awk -F',' 'NR>=2 && NR<=5 {print $0}' userprofile.csv
# sql
select * from user_table limit 1,5
2.3 汇总:sum,count
- city='北京'的行
# awk
awk -F',' '$4=="北京"{a+=1}END{print a}' userprofile.csv
# sql
select count(*) from user_table where city='北京'
- 男生年龄总和
# awk
awk -F',' '$2=="男"{a+=$3}END{print a}' userprofile.csv
# sql
select sum(age) from user_table where sex='男'
2.4 group by汇总:sum,count
- 按性别分组, 计算各组人数和年龄平均值
# awk
awk -F',' '{a[$2]+=1;b[$2]+=$3}END{for (i in a)print i, "人数:",a[i], "平均年龄:", b[i]/a[i]}' userprofile.csv
# sql
select sex, count(*) as `人数`, avg(age) from user_table group by sex
2.5 like模糊匹配
- 按行匹配: 把含有'北京'的行打印出来
# awk
awk -F',' '/北京/{print $0}' userprofile.csv
# sql: awk是按正行匹配, sql其实只能按字段进行匹配,这里反而awk方便些
select * from user_table where city='北京'
- 按行匹配: 把不含'北京'的行打印出来
# awk
awk -F',' '!/北京/{print $0}' userprofile.csv
# sql: awk是按正行匹配, sql其实只能按字段进行匹配,这里反而awk方便些
select * from user_table where city<>'北京'
- 按列匹配: 把第4列含有北京'的行打印出来
# awk
awk -F',' '$4~/北京/{print $0}' userprofile.csv
# sql
select * from user_table where city='北京'
- 按列匹配: 把第4列不含'北京'的行打印出来
# awk
awk -F',' '$4!~/北京/{print $0}' userprofile.csv
# sql
select * from user_table where city<>'北京'
以上是数据处理时awk最常用的一些命令,awk功能强大, 能做的事情不仅上面这点, 比如处理多个文件, 甚至达到类似join的效果,感兴趣的话可以google了解一下
友情提示
awk, 了解多一点,只怕你会爱上它
3. About Me
来自北京回龙观的一名数据民工, 2019年开始写写数据民工那些大白话
- 微信公众号: workindata
- 个人微信号: ITlooker
- 知乎专栏: 大数据那些儿大白话
欢迎关注,加微,唠嗑,吐槽