awk条件语句


条件语句用于在执行操作之前做一个测试。在前面的章节中,我们看到了模式匹配规则的一些示例。模式匹配规则本质上就是影响输入循环的条件表达式。在这一部分,我们主要就在action中所使用的条件语句进行探讨。条件语句以if开头,并计算放在圆括号中的表达式。语法是:

if (expression)
action1
[else
action2]

如果条件表达式expression的值为真(非零或非空),就执行action1 。当存在else语句时,如果条件表达式的值为假(零或空) ,则执行action2。一个条件表达式可能包含算术运算符、关系操作符、或布尔操作符,这些都在awk脚本中讨论过。也许最简单的条件表达式是测试一个变量是否非零。

if (x) print x

如果x是零, print语句将不执行。如果x是一个非零值,将打印x的值。也可以测试x是否等于另一个值:

if ( x == y ) print x

注意, "=="是关系操作符而"="是赋值操作符。我们还可以用模式匹配操作符"~"来测试x是否与一个模式匹配:

if ( x ~ /[yY](es)?/ ) print x

以下是几个补充的语法要点。如果操作时由多个语句组成的,要用一对大括号将操作括起来。

if (expression)
statement1
statement2
}

awk对大括号和语句的位置没有特殊的要求(和sed不同)。左大括号放在条件表达式后面,可以与条件表达式位于一行也可以在下一行。第一条语句可以紧跟左大括号或从下一行开始,右大括号放在最好一条语句的后面,可以与最后一条语句位于同一行也可以在下一行。在大括号的前后允许有空格或制表符。虽然没有要求语句缩进书写,但这样可以改善可读性。

右大括号和else后面的换行符是可选的。

if ( expression) action1
[else action2]

如果在action1后面加一个分号表示结束, action1后面的换行也是可选的。

if ( expression) action1; [else action2]

如果在同一行上用分号分隔多个语句,同样需要使用大括号。

在前面的文章中,我们曾看见过一段脚本用于计算学生平均成绩。我们可以用一个条件来判断某个学生是否及格。

if ( avg >= 65 )
grade = "Pass"
else
grade = "Fail"

赋给grade的值取决于表达式"avg >=65" 的计算结果是真还是假。

可以用多个条件语句来测试多个条件中的某个是否为真。例如,也许学生的成绩要用字母分级表示,而不是用及格或不及格来表示。以下用一个条件结构根据学生的平均分来指定一个字母成绩:

if (avg >= 90) grade = "A"
else if (avg >= 80) grade = "B"
else if (avg >= 70) grade = "C"
else if (avg >= 60) grade = "D"
else grade = "F"

应该注意到的一个重要事情是,这种连续条件只有当一个条件表达式计算结果为真时才停止求值,这时将跳过其他的条件。如果没有一个条件表达式的计算结果为真,将执行最后的else部分,运行默认操作,在这种情况下为grade赋值"F" 。

相关内容

    暂无相关文章