shell 分割文本_大白话shell命令awk:数据统计(二)

1f11650070fe12a293d1ea080bf4f853.png

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 '{正则+处理逻辑}' '文件名'

举个例子:

d29deea4553754da7c9be6d9cfda4367.png

2.1 列选择

  • 选择第2,4列
# awk
awk -F',' '{print $2,$4}' userprofile.csv

# sql
select sex, city from user_table

609f734a608bb9982f21197ee0c13b33.png

2.2 行选择

  • 选择2-5行
# awk
awk -F',' 'NR>=2 && NR<=5 {print $0}' userprofile.csv

# sql
select * from user_table limit 1,5

663d826fd543ce1037f617a0947cab47.png

2.3 汇总:sum,count

  • city='北京'的行
# awk
awk -F',' '$4=="北京"{a+=1}END{print a}' userprofile.csv

# sql
select count(*) from user_table where city='北京'

90826edbd39642edc9f274066a54fca8.png
  • 男生年龄总和
# awk
awk -F',' '$2=="男"{a+=$3}END{print a}' userprofile.csv

# sql
select sum(age) from user_table where sex='男'

45ace2c204056e9c6fd569bdb2ca1a80.png

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

5054eb16e0467556311765cdcbaab7ad.png

2.5 like模糊匹配

  • 按行匹配: 把含有'北京'的行打印出来
# awk
awk -F',' '/北京/{print $0}' userprofile.csv

# sql: awk是按正行匹配, sql其实只能按字段进行匹配,这里反而awk方便些
select * from user_table where city='北京'

0634b39b1081e54ba2e2707a6aec8512.png
  • 按行匹配: 把不含'北京'的行打印出来
# awk
awk -F',' '!/北京/{print $0}' userprofile.csv

# sql: awk是按正行匹配, sql其实只能按字段进行匹配,这里反而awk方便些
select * from user_table where city<>'北京'

d4d8a4b892a7e96fb822c508f392efae.png
  • 按列匹配: 把第4列含有北京'的行打印出来
# awk
awk -F',' '$4~/北京/{print $0}' userprofile.csv

# sql
select * from user_table where city='北京'

cb0deb2b4ae0b0df72ae1f6a9e079479.png
  • 按列匹配: 把第4列不含'北京'的行打印出来
# awk
awk -F',' '$4!~/北京/{print $0}' userprofile.csv

# sql
select * from user_table where city<>'北京'

d7bec6e8df200be40bdad9fa64ce6d48.png

以上是数据处理时awk最常用的一些命令,awk功能强大, 能做的事情不仅上面这点, 比如处理多个文件, 甚至达到类似join的效果,感兴趣的话可以google了解一下

友情提示

awk, 了解多一点,只怕你会爱上它

3. About Me

来自北京回龙观的一名数据民工, 2019年开始写写数据民工那些大白话

  • 微信公众号: workindata
  • 个人微信号: ITlooker
  • 知乎专栏: 大数据那些儿大白话

欢迎关注,加微,唠嗑,吐槽

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值