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

简介: 众所周知,awk不是一个工具/命令,它其实是一种『编程语言』。对于后台开发工程师而言,不管你是什么语言的工程师。对于统计线上数据,从日志提炼信息等等场景,awk都是必备神器!

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

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


场景1


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

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


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的数据来输出。


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。


简化:交集和差集


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


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的差集了。


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的拿手好戏了,快到不敢相信。



相关文章
|
4月前
|
移动开发 HTML5
分组元素
分组元素。
26 3
|
10月前
|
SQL
判断两个时间段交集、时间重叠问题
判断两个时间段范围是否有交集(时间重叠)问题经常遇到,比如预约会议室开会,活动的开始结束等,本文做此分析。
418 0
|
Python
将列表按照指定的规则排序并添加平均值
将列表按照指定的规则排序并添加平均值
65 1
2023-4-6-C++Vector求交集并集和差集(去除冗余数)
2023-4-6-C++Vector求交集并集和差集(去除冗余数)
85 0
|
JSON 数据格式 Python
一日一技:包含非hashable元素的列表如何去重并保持顺序?
一日一技:包含非hashable元素的列表如何去重并保持顺序?
103 0
|
Python
LeetCode 1282. 用户分组
有 n 位用户参加活动,他们的 ID 从 0 到 n - 1,每位用户都 恰好 属于某一用户组。给你一个长度为 n 的数组 groupSizes,其中包含每位用户所处的用户组的大小,请你返回用户分组情况(存在的用户组以及每个组中用户的 ID)。
72 0
|
Windows
7-9 集合相似度 (25 分)(交集/并集)
7-9 集合相似度 (25 分)(交集/并集)
137 0
|
Python
Python编程:itemgetter获取字典元素和groupby分组
Python编程:itemgetter获取字典元素和groupby分组
208 0
|
小程序 JavaScript API
小程序实现索引列表排序
小程序实现索引列表排序
380 0