Linux高级文本处理之gawk分支和循环(2)

实例2:算 items-sold.txt 文件中,每件商品出售的总数

[root@localhost ~]# cat items-sold.txt  101 2 10 5 8 10 12 102 0 1 4 3 0 2 103 10 6 11 20 5 13 104 2 3 4 0 6 5 105 10 2 5 7 12 6 [root@localhost ~]# awk ' >{i=2;total=0;while(i<=NF)  >{total=total+$i;i++;} >print total}' items-sold.txt  47 10 65 20 42 三、do-while 循环

While 循环是一种进入控制判断的循环结构,因为在进入循环体前执行判断。而 do-while 循 环是一种退出控制循环,在退出循环前执行判断。 do-while 循环至少会执行一次,如果条 件为 true,它将一直执行下去。

语法:

do action while(condition)

实例1:

[root@localhost ~]# awk 'BEGIN{ do print "this is a test";while (count++ < 5);}'  this is a test this is a test this is a test this is a test this is a test this is a test

注意:首先执行一次,所以上述实例打印6次。

实例2:

[root@localhost ~]# cat dowhile.awk  { i=2; total=0; do { total = total + $i; i++; } while(i<=NF) print "Item",$1,":",total,"quantities sold"; } [root@localhost ~]# awk -f dowhile.awk items-sold.txt  Item 101 : 47 quantities sold Item 102 : 10 quantities sold Item 103 : 65 quantities sold Item 104 : 20 quantities sold Item 105 : 42 quantities sold 四、for循环

语法:

for(initialization;condition;increment/decrement)

for 循环一开始就执行 initialization,然后检查 condition,如果 condition 为 true,执行 actions,然后执行 increment 或 decrement.如果 condition 为 true,就会一直重复执行 actions 和increment/decrement。

实例1:计算1到4的整数和。

[root@localhost ~]# echo "1 2 3 4"|awk '{for(i=1;i<=NF;i++) total+=$i;}END{print total}' 10

实例2:把文件中的字段反序打印出来

[root@localhost ~]# awk '    >BEGIN{ORS=""} >{for(i=NF;i>0;i--)  >print $i," "; >print "\n"}' items-sold.txt  12  10  8  5  10  2  101  2  0  3  4  1  0  102  13  5  20  11  6  10  103  5  6  0  4  3  2  104  6  12  7  5  2  10  105

注意:在 awk 里, print 和 printf 的区别是, print 输出当前记录(行 record), 并在最后自动加上 ORS ( 默认是\n ,但可以是任何字符串). 而 printf 是按给定格式输出内容, 你给它 ORS 参数, 它就输出 ORS, 没给就不输出.

五、break 语句

Break 语句用来跳出它所在的最内层的循环(while,do-while,或 for 循环)。请注意, break 语句 只有在循环中才能使用。

实例1:打印某个月销售量为 0 的任何商品

[root@localhost ~]# awk ' >{for(i=2;i<=NF;i++)  >{if($i == 0)  >{print $0;break;}}}' items-sold.txt  102 0 1 4 3 0 2 104 2 3 4 0 6 5

实例2:

[root@localhost ~]# awk 'BEGIN{while(1) {i++;if(i==10) break;print "young";}}' young young young young young young young young young 六、 continue 语句 Continue 语句跳过后面剩余的循环部分,立即进入下次循环。 请注意, continue 只能用在循 环当中。

实例1:打印 items-sold.txt 文件中所有商品的总销售量

[root@localhost ~]# awk ' >{total=0;for(i=1;i<=NF;i++)  >{if(i == 1) continue;total+=$i}; >print total}' items-sold.txt  47 10 65 20 42

实例2:

[root@localhost ~]# awk 'BEGIN{for(i=1;i<=5;i++)  >{if(i ==3 ) continue; >print "this is:",i,"x";}}'  this is: 1 x this is: 2 x this is: 4 x this is: 5 x 六、exit 语句

exit 命令立即停止脚本的运行,并忽略脚本中其余的命令。 exit 命令接受一个数字参数最为 awk 的退出状态码,如果不提供参数,默认的状态码是 0.

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/14414.html