Awk:检查字段值是否在给定的

Awk:检查字段值是否在给定的,awk,Awk,我需要打印所有行,其中字段$2是以下字段之一(23、17、21、1) 不起作用应该这样做: awk '$2~/^(23|17|21|1)$/' file 这将测试字段#2是否为23、17、21或1中的一个 仅举一个有关如何使用阵列的示例: awk 'BEGIN{split("23 17 21 1",tmp); for (i in tmp) arr[tmp[i]]} $2 in arr' file 制作一个带有数字的变量数据, 使用Split将其拆分为数组arr 如果在arr中找到$2,则在

我需要打印所有行,其中字段$2是以下字段之一(23、17、21、1)

不起作用

应该这样做:

awk '$2~/^(23|17|21|1)$/' file
这将测试字段
#2
是否为23、17、21或1中的一个


仅举一个有关如何使用阵列的示例:

awk 'BEGIN{split("23 17 21 1",tmp); for (i in tmp) arr[tmp[i]]} $2 in arr' file
制作一个带有数字的变量
数据

使用
Split
将其拆分为数组
arr

如果在arr中找到
$2
,则在每行前面循环使用
arr中的所有值并打印


编辑:用Eds建议更新。

确实如此!谢谢@不客气。我刚刚添加了一个关于如何使用数组的示例。+1但是
data=“23 17 21 1”;split(data,arr,“”)
可以简单地
split(“23 17 21 1”,arr)
而且更好的完整解决方案是
开始{split(“23 17 21 1”,tmp);对于(我在tmp中)arr[tmp[i]}$2在arr'文件中
,从那时起,你不需要为每行循环一次数组。@EdMorton感谢更新。我知道这可能会缩短一些,更多的人把它作为一个例子。将更新该帖子。
awk 'BEGIN{split("23 17 21 1",tmp); for (i in tmp) arr[tmp[i]]} $2 in arr' file