AWK:用正则表达式缩短if-then-else

时间:2013-01-23 11:34:18

标签: regex awk syntactic-sugar

以下AWK格式:

/REGEX/ {Action}

如果当前行与Action匹配,则会执行REGEX

有没有办法添加else子句,如果当前行与正则表达式不匹配,将执行该子句,而不使用if-then-else显式,如下所示:

/REGEX/ {Action-if-matches} {Action-if-does-not-match}

3 个答案:

答案 0 :(得分:16)

没那么短:

/REGEX/ {Action-if-matches} 
! /REGEX/ {Action-if-does-not-match}

但是(g)awk也支持三元运算符:

{ /REGEX/  ? matching=1 : matching = 0 ; if ( matching ==1 ) { matching_action } else { notmatching_action } }

更新

根据伟大的格伦杰克曼的说法,您可以在比赛中指定变量,如:

m = /REGEX/ { matching-action } !m { NOT-matching-action }

答案 1 :(得分:14)

还有next

/REGEX/ {
    Action
    next # skip to the next line
}
{ will only get here if the current line does *not* match /REGEX/ }

答案 2 :(得分:1)

你可以做一个“技巧”。如您所知,AWK尝试按顺序匹配每个正则表达式的输入,以执行其块。

如果$ 1为“1”,则此代码执行第二个块,否则执行第三个块:

awk '{used = 0} $1 == 1 {print $1" is 1 !!"; used = 1;} used == 0 {print $1" is not 1 !!";}'

如果输入为:

1
2

打印:

1 is 1 !!
2 is not 1 !!