首页 > 解决方案 > awk 模式搜索数组中的所有项目

问题描述

工作awk代码:

BEGIN {bla}
/patern1/ {userFunction(input1)} 
...                              
/paternN/ {userFunction(inputN)} 
END {bla}

现在我尝试存储paternXinputX使用数组并使用 for 循环

实际试过:

for (i in patern)
    $0 ~ /patern[i]/ {userFunction(input[i])}

$ ... awk:38: for (i in patern)
$ ... awk:38: ^ syntax error

或者

$0 ~ /for (i in patern)/ {userFunction(input[i])}

$ ... awk:40:         $0 ~ /patern[i]/ {userFunction(input[s])}
$ ... awk:40:                          ^ syntax error

简化示例

cat >> inputs << EOF
1
2
3
1
1
EOF

在职的

awk '
/1/{print "one"}
/2/{print "two"}' inputs

标签: arraysawk

解决方案


for-- 并且if-- 是一个只能进入 awk 规则的“动作”部分而不是“条件”部分的语句;并且//仅适用于文字模式(正则表达式)而不是变量:

{ for( i in patterns ) if( $0 ~ patterns[i] ) userFunction( inputs[i] ) }

但是,由于 awk 数组下标可以是任何字符串,也称为“关联”,而不是让两个数组保持同步,您可以使用一个:

BEGIN{ pat_inp["pattern1"]="input1"; pat_inp["pattern2"]="input2"; ... }
{ for( i in pat_inp ) if( $0 ~ i ) userFunction( pat_inp[i] ) }

推荐阅读