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



相关文章
如何用vcftools从VCF文件中提取某条染色体信息
如何用vcftools从VCF文件中提取某条染色体信息
|
搜索推荐 C++ 容器
你很可能需要知道这个调试小技巧
你很可能需要知道这个调试小技巧
|
Java Linux Apache
Maven下载和配置教程:Windows、Mac和Linux系统安装指南
Maven下载和配置教程:Windows、Mac和Linux系统安装指南
1678 0
|
Web App开发 数据采集 存储
WebDriver与Chrome DevTools Protocol:如何在浏览器自动化中提升效率
本文探讨了如何利用Chrome DevTools Protocol (CDP) 与 Selenium WebDriver 提升浏览器自动化效率,结合代理IP技术高效采集微博数据。通过CDP,开发者可直接操作浏览器底层功能,如网络拦截、性能分析等,增强控制精度。示例代码展示了如何设置代理IP、cookie及user-agent来模拟真实用户行为,提高数据抓取成功率与稳定性。适用于需要频繁抓取互联网数据的应用场景。
1527 3
WebDriver与Chrome DevTools Protocol:如何在浏览器自动化中提升效率
|
存储 前端开发 JavaScript
什么是web与搭建自己的第一个pikachu靶场
本文是关于Web基础知识和搭建Pikachu靶场的教程。首先介绍了Web的定义,强调其作为互联网信息传输方式的核心是超链接,以及HTML、CSS和JavaScript在构建网页中的作用。接着,详细讲解了如何在本地使用phpStudy搭建Pikachu靶场,包括下载相关软件、配置安装路径、启动环境和初始化数据库设置。对于使用特定Win7系统的用户,提供了因系统自带phpStudy导致安装问题的解决办法。分享了学习心得和每日一言,鼓励专注力的重要性。
|
JSON Java 关系型数据库
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应数据库中json数据类型,更新时报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
1502 4
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
|
IDE Java Maven
解决 idea maven项目启动项目不编译target 文件问题
解决 idea maven项目启动项目不编译target 文件问题
1303 2
|
Linux Windows Perl
windows下编译openssl
windows下编译openssl
703 0
|
存储 缓存 网络协议
DPDK:UDP 协议栈的实现
DPDK:UDP 协议栈的实现
|
Kubernetes Cloud Native 数据安全/隐私保护
云原生|kubernetes |部署k8s图形化管理组件 kuboard v3
云原生|kubernetes |部署k8s图形化管理组件 kuboard v3
1216 0