awk一行码:筛选某列指定值的数据

时间:2025-03-31 17:59:11

awk其实不只是一个工具、一个命令,它其实也是一种『编程语言』。

场景1

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

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

awk -F'\t' '{if($2==123) print $0}'   > new_data.txt

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

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

场景2:

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

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


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

awk -F '\t' 'BEGIN{while(getline<"") a[$1]=1;} {if(a[$2]==1) print $0;}'  > new_data.txt

(分号也可以去掉)

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

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

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


有时候我们可能需要离线处理一些数据,当然我们可以写Python来实现,但是很多时候,每次写一个Python脚本,有点杀鸡用牛刀的感觉。另外就是如果一个文件特别大,比如10G。Python脚本的效率不一定高。