awk一行码:求交集、差集、筛选白名单数据
2023-04-18 14:46:38 时间
众所周知,awk不是一个工具/命令,它其实是一种『编程语言』。
对于后台开发工程师而言,不管你是什么语言的工程师。对于统计线上数据,从日志提炼信息等等场景,awk都是必备神器!
场景1:
一个TAB分割的数据文件,假设名为data.txt,第二列为用户id。
从中筛选用户id为123的所有数据:
awk -F' ' '{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 ' ' '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 ' ' 'BEGIN{while(getline<"a.txt") a[$0]=1;} {if(a[$0]==1) print $0;}' b.txt > ab.txt
要求差集,改下判断条件,如下便是b.txt 减去 a.txt的差集了。
awk -F ' ' 'BEGIN{while(getline<"a.txt") a[$0]=1;} {if(a[$0]!=1) print $0;}' b.txt > ba.txt
有时候我们离线处理一些数据,你会说人生苦短,我用Python。
我们当然可以用Python来实现,但是很多时候,每次写一个Python脚本,有点杀鸡用牛刀的感觉。另外就是如果一个文件特别大,比如10G。Python脚本会卡很久(除非你自己做大量优化),彼时该就上演awk的拿手好戏了,快到不敢相信。
相关文章
- 中国计算机协会秘书长杜京哲:软硬协同创新助力计算产业发展破局
- 仅靠合成数据就能实现真实人脸分析!微软这项新研究告别人工标注
- 小模型大趋势!Google 提出两个模型:体积下降7倍,速度提升10倍
- 美国要求台积电、三星45天内主动交出商业数据,不配合将采取行动
- 盘点Facebook“七宗罪”:元宇宙只是一块“遮羞布”?
- 谈谈反对量子计算的理由
- 错误率减半需要超过500倍算力!深度学习的未来,光靠烧钱能行吗?
- 最会造假的GAN模型!Facebook发布IC-GAN,迁移能力史上超强
- 达摩院发表Nature子刊,新型比特量子芯片将于云栖大会发布
- 网民人均每天刷短视频1.5个小时!在互联网娱乐,算浪费时间吗?
- 科学家发现一种能解决“最难”计算机问题的新方法
- Google量子计算AI实验室大公开,并分享了未来十年的路线图
- 储备池计算新突破:神经元更少,计算速度最高提升百万倍
- 用TensorFlow实现ML模型并调优:每秒可做3亿次预测
- 运维必知的23个经验教训,杜绝在死亡边缘疯狂试探……
- 巨头们都要抢占的XPU道路,真的有这么香吗?
- 华人计算机科学泰斗高光荣逝世:中国第一位MIT博士,开创数据流体系结构
- CVPR 2021发表视频慢动作的新sota,还发了160FPS的数据集
- 零样本性能超越小样本,谷歌1370亿参数新模型比GPT-3更强
- 量子计算的突破:三个自旋立方体的纠缠在硅中得以实现