AWK(5)之结构化命令

AWK(5)之结构化命令

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:

本部分内容参考自《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 语句一样自己负责给计数器增值了。

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.zze.xyz/archives/awk5.html

Buy me a cup of coffee ☕.