awk连载8: awk循环控制语句
break语句
循环语句里,在循环的过程中,如果遇到break,则终止循环。
先看文件ee.txt的内容:
[root@vms63 ~]# cat ee.txt
1 2 3 4 5 3 2 1
1 3 3 2 2 3 2 1
[root@vms63 ~]#
现在对第一行的每部分进行循环:
NR==1指明的对第一行进行操作
结果就是把第一行的每个字段都打印出来了。
如果现在要求如果某部分的值大于2了,则不在循环
[root@vms63 ~]# awk 'NR==1{for(i=1;i<=NF;i++){if($i>2){break}print $i}}' ee.txt
1
2
[root@vms63 ~]#
此语句和上面的语句相比只是多了一条if($i>2){break},意思是如果某字段的值大于2则执行break
看看ee.txt的第一行的值1 2 3 4 5 3 2 1
此时第一个和第二个值分别是1和2,不满足$i>=2则继续执行print操作。
第三个值为3,满足判断语句的大于2,则执行break,然后循环结束,后面的值3 4 5 3 2 1都不再循环。
continue语句
如果遇到了continue的话,则continue后面的语句不再执行,直接进行下一次循环(记住break是终止循环)。还看刚才的例子
[root@vms63 ~]# awk 'NR==1{for(i=1;i<=NF;i++){if($i>2){continue}print $i}}' ee.txt
1
2
2
1
[root@vms63 ~]#
如果某分段的值大于2则执行continue,进行下一次循环,所以
看看ee.txt的第一行的值1 2 3 4 5 3 2 1
一开始的 1和2打印,3,4,5,3满足大于2,进行分别进行下一次循环,最后的2,1也是满足条件的,打印。
next语句
如果遇到next语句的话,则next后面的命令不再执行,跳出本循环进行下一次循环:
[root@vms63 ~]# awk '{for(i=1;i<=NF;i++){if($i>2){break}print $i}}' ee.txt
1
2
1
[root@vms63 ~]#
其实前面的语句里,默认也有next语句。
next语句也可以用于判断语句,比如下面的例子:
再看ee.txt的内容
[root@vms63 ~]# cat ee.txt
1 2 3 4 5 3 2 1
1 3 3 2 2 3 2 1
[root@vms63 ~]#
做如下操作,如果第2部分的值小于等于2,则不打印该行:
[root@vms63 ~]# awk '{if($2<=2){next};print $0}' ee.txt
1 3 3 2 2 3 2 1
[root@vms63 ~]#
当$2<=2的时候,则执行next,next后面的print $0不再执行,所以第一行跳过去了没有打印,在第二行里,第二部分的值为3,不满足if条件,所以不会执行next语句,则打印了print $0 。