Nathanaël
Nathanaël

Reputation: 17

awk patern search for all item in array

Working awk code:

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

Now I try to store paternX and inputX using array and use a for loop

Actually tried:

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

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

Or

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

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

Simplified example

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

Working

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

Upvotes: 0

Views: 42

Answers (1)

dave_thompson_085
dave_thompson_085

Reputation: 38990

for -- and also if -- is a statement that can only go in the 'action' part of an awk rule, not the 'condition' part; and // is only for literal patterns (regexps) not variables:

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

However, since awk array subscripts can be any string, also called 'associative', rather than keep two arrays in sync you can use one:

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

Upvotes: 2

Related Questions