问题
The following AWK format:
/REGEX/ {Action}
Will execute Action
if the current line matches REGEX
.
Is there a way to add an else
clause, which will be executed if the current line does not matches the regex, without using if-then-else explicitly, something like:
/REGEX/ {Action-if-matches} {Action-if-does-not-match}
回答1:
Not so short:
/REGEX/ {Action-if-matches}
! /REGEX/ {Action-if-does-not-match}
But (g)awk supports the ternary operator too:
{ /REGEX/ ? matching=1 : matching = 0 ; if ( matching ==1 ) { matching_action } else { notmatching_action } }
UPDATE:
According to the great Glenn Jackman you can assign variables on the match like:
m = /REGEX/ { matching-action } !m { NOT-matching-action }
回答2:
There's also next
:
/REGEX/ {
Action
next # skip to the next line
}
{ will only get here if the current line does *not* match /REGEX/ }
回答3:
You can do a "trick". As you know AWK tries to match the input to each regex in order, to execute its block.
This code executes the second block if $1 is "1", else it executes the third block:
awk '{used = 0} $1 == 1 {print $1" is 1 !!"; used = 1;} used == 0 {print $1" is not 1 !!";}'
If the input is:
1
2
It prints:
1 is 1 !!
2 is not 1 !!
来源:https://stackoverflow.com/questions/14478722/awk-shortened-if-then-else-with-regex