本部分内容参考自《Linux命令行与shell脚本编程大全 第3版》。
gawk 编程语言支持常见的结构化编程命令。本节将会介绍这些命令,并演示如何在 gawk 编程环境中使用它们。
if语句
gawk 编程语言支持标准的 if-then-else 格式的 if 语句。你必须为 if 语句定义一个求值的条件,并将其用圆括号括起来。如果条件求值为 TRUE,紧跟在 if 语句后的语句会执行。如果条件求值为 FALSE,这条语句就会被跳过。可以用这种格式:
if (condition)
statement1
也可以将它放在一行上,像这样:
if (condition) statement1
下面这个简单的例子演示了这种格式的。
$ cat test5.txt
10
5
13
50
34
$ gawk '{if ($1 > 20) print $1}' test5.txt
50
34
并不复杂。如果需要在 if 语句中执行多条语句,就必须用花括号将它们括起来。
$ gawk '{
> if ($1 > 20){
> result=$1*2;
> print result;
> }}' test5.txt
100
68
gawk 的 if 语句也支持 else 子句,允许在 if 语句条件不成立的情况下执行一条或多条语句。这里有个使用 else 子句的例子。
$ gawk '{
> if ($1 > 20){
> print $1/2;
> }
> else
> {
> print $1*2;
> }
> }' test5.txt
20
10
26
25
17
可以在单行上使用 else 子句,但必须在 if 语句部分之后使用分号。
if (condition) statement1; else statement2
以下是上一个例子的单行格式版本。
$ gawk '{if ($1 > 20) print $1 / 2; else print $1 * 2}' test5.txt
20
10
26
25
17
这个格式更紧凑,但也更难理解。
while语句
while 语句为 gawk 程序提供了一个基本的循环功能。下面是 while 语句的格式。
while (condition)
{
statements
}
while 循环允许遍历一组数据,并检查迭代的结束条件。如果在计算中必须使用每条记录中的多个数据值,这个功能能帮得上忙。
$ cat test6.txt
130 120 135
160 113 140
145 170 215
$ gawk '{
> total = 0;
> i = 1;
> while ( i < 4 ){
> total += $i;
> i++;
> }
> avg = total / 3;
> print "Average:",avg;
> }' test6.txt
Average: 128.333
Average: 137.667
Average: 176.667
while 语句会遍历记录中的数据字段,将每个值都加到 total 变量上,并将计数器变量 i 增值。当计数器值等于 4 时,while 的条件变成了 FALSE,循环结束,然后执行脚本中的下一条语句。这条语句会计算并打印出平均值。这个过程会在数据文件中的每条记录上不断重复。
gawk 编程语言支持在 while 循环中使用 break 语句和 continue 语句,允许你从循环中跳出。
$ gawk '{
> total = 0;
> i = 1;
> while (i < 4){
> total += $i
> if (i == 2) break;
> i++;
> }
> avg = total / 2;
> print "Average of the first two data:",avg;
> }' test6.txt
Average of the first two data: 125
Average of the first two data: 136.5
Average of the first two data: 157.5
do-while语句
do-while 语句类似于 while 语句,但会在检查条件语句之前执行命令。下面是 do-while 语句的格式。
do
{
statements
} while (condition)
这种格式保证了语句会在条件被求值之前至少执行一次。当需要在求值条件前执行语句时,这个特性非常方便。
$ gawk '{
> total = 0;
> i = 1;
> do{
> total += $i;
> i++;
> } while (total < 150)
> print total }' test6.txt
250
160
315
这个脚本会读取每条记录的数据字段并将它们加在一起,直到累加结果达到 150。如果第一个数据字段大于 150(就像在第二条记录中看到的那样),则脚本会保证在条件被求值前至少读取第一个数据字段的内容。
for语句
for 语句是许多编程语言执行循环的常见方法。 gawk编程语言支持 C 风格的 for 循环。
for( variable assignment; condition; iteration process)
将多个功能合并到一个语句有助于简化循环。
$ gawk '{
> total = 0;
> for (i = 1; i < 4; i++){
> total += $i;
> }
> avg = total / 3;
> print "Average:", avg;
> }' test6.txt
Average: 128.333
Average: 137.667
Average: 176.667
定义了 for 循环中的迭代计数器,你就不用担心要像使用 while 语句一样自己负责给计数器增值了。
评论区