AWK 模式-代码-块语法:如何在 AWK 中按模式运行代码块?

AWK 模式-代码-块语法:如何在 AWK 中按模式运行代码块?

假设我有几种行格式:

this:foo ...
that: foo ...

我想为一种形式或另一种形式运行两个不同的例程:

cat text_file \
| awk -F ':' '/:foo/ { # do this } # else print the whole line unchanged' 
| awk -F ':' '/ +foo +/ { # do that } # else print the whole line unchanged'

理想情况下,我可以写:

cat text_file \
| awk -F ':' '
   /:foo/ { ... }
   / +foo +/ { ... } 
   ...
   /.*/ { print }
'

但事情的发展似乎与我的预期有很大不同。有什么特殊的方法可以做到这一点吗?

答案1

你可以做:

awk '
    /:foo/ { print "do-things"; next }
    /[[:blank:]]+foo[[:blank:]]+/ { print "do-some-other-things"; next }
    { print "do-else" }
' infile

注意next我们使用的语句;也就是说,如果给定块的条件为真,则跳到运行其余代码;如果上述两个块条件都不满足,则将执行最后一个块。

答案2

我想你想要:

awk -F: '
    $2 ~ /^[[:blank:]]/ {
        print "2nd field start with space"
    }
    $2 == "" || $2 ~ /^[^[:blank:]]/ {
        print "2nd field does not start with space"
    }
    { print }
' text_file

相关内容