前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >awk一行码:求交集、差集、筛选白名单数据

awk一行码:求交集、差集、筛选白名单数据

作者头像
果冻虾仁
发布2021-12-08 13:49:39
1.5K0
发布2021-12-08 13:49:39
举报
文章被收录于专栏:后台公论后台公论

众所周知,awk不是一个工具/命令,它其实是一种『编程语言』。

对于后台开发工程师而言,不管你是什么语言的工程师。对于统计线上数据,从日志提炼信息等等场景,awk都是必备神器!

场景1

一个TAB分割的数据文件,假设名为data.txt,第二列为用户id。

从中筛选用户id为123的所有数据:

代码语言:javascript
复制
awk -F'\t' '{if($2==123) print $0}'  data.txt > new_data.txt

awk的列从1计数,1是第一列,2是第2列……

$0是特殊的变量,表示这一整行的数据。

场景2:

如果要筛选多个用户id怎么办?

可以将待筛选的用户id存入一个文件userid.txt。一行一个id。

过滤data.txt,找到userid.txt中的用户id的数据来输出。

代码语言:javascript
复制
awk -F '\t' 'BEGIN{while(getline<"userid.txt") a[$1]=1;} {if(a[$2]==1) print $0;}' data.txt > new_data.txt

(分号也可以去掉)

BEGIN语法是在逐行解析之前执行的一段代码。这里它会加载userid.txt将用户id存入关联数组a中:key是用户id,value是1。

后面的代码块开始逐行解析,用data.txt的第二列做key去关联数组a中查找。如果查找到value为1,就输出整行。

关联数组就类似其他语言里面的dict或map。

简化:交集和差集

这一行码可以改成求两个文件的交集。只需要调整读取的列号即可。

代码语言:javascript
复制
awk -F '\t' 'BEGIN{while(getline<"a.txt") a[$0]=1;} {if(a[$0]==1) print $0;}' b.txt > ab.txt

要求差集,改下判断条件,如下便是b.txt 减去 a.txt的差集了。

代码语言:javascript
复制
awk -F '\t' 'BEGIN{while(getline<"a.txt") a[$0]=1;} {if(a[$0]!=1) print $0;}' b.txt > ba.txt

有时候我们离线处理一些数据,你会说人生苦短,我用Python。

我们当然可以用Python来实现,但是很多时候,每次写一个Python脚本,有点杀鸡用牛刀的感觉。另外就是如果一个文件特别大,比如10G。Python脚本会卡很久(除非你自己做大量优化),彼时该就上演awk的拿手好戏了,快到不敢相信。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程往事 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档