awk学习笔记(14) - 循环

awk中的循环包括以下几种:

  • 1.do-while
  • 2.while
  • 3.for

下面依次举例说明:

do-while

创建dowhile.awk,内容如下:


  1. BEGIN {do
  2. print "Enter y or n ! " 
  3. getline data 
  4. while( data !~ /^[YyNn]$/)} 

调用:


  1. awk -f dowhile.awk 

输出:


  1. Enter y or n !  

当输出y或n的时候(大小写均可)程序退出,其余情况会要求再次输入。

while

创建测试文件address.dat,这是一个通讯录:


  1. 张三 
  2. 13512345678 
  3. zhangsan@163.com 
  4. 新浪 
  5.  
  6. 李四 
  7. 13811111111 
  8. lisi@google.com 
  9. 百度 

每4行是一组记录,用一个空行间隔开来,现在要整理成每一行是一组记录,下面是整理程序format-address.awk:


  1. BEGIN { 
  2.     FS="\n" 
  3.     RS="" 
  4.     ORS="" 
  5. {  
  6.     x=1 
  7.     while ( x<NF ) { 
  8.         print $x "\t" 
  9.         x++ 
  10.     } 
  11.     print $NF "\n" 

执行:


  1. awk -f format-address.awk address.dat 

输出:


  1. 张三  13512345678 zhangsan@163.com    新浪 
  2. 李四  13811111111 lisi@google.com 百度 

程序说明:

在BEGIN段中,设置了如下的内置变量:

  • FS(字段分隔符)由任意的空格改成了换行符(\n);
  • RS(记录分隔符)由默认的换行(\n)换成了空字符;
  • ORS(输出记录分隔符)由默认的换行符(\n)换成了空字符。

while循环段中NF(记录字段数)作为循环条件,x变量依次被组拼成$1-$3,用制表符(\t)间隔开来。$4输出后,追加一个换行符(\n)。

for/for-in

awk中for循环有两种:

  • 1.一种是普通的for (initialization; condition; increment),
  • 2.另一种是for(i in array)。

举例说明:

1.普通for循环

创建测试数据文件number.txt,内容如下:


  1. 12 23 34 45 56 
  2. 34 56 23 45 23 

编写awk程序文件,for.awk:


  1. for (i = 1; i <= NF; i++)  
  2. total = total+$i 
  3. END { print total } 

执行:


  1. awk -f for.awk number.txt 

输出:


  1. 351 

说明:

上面的程序实际上是求数据的总和,读取每一行,将每一行的数值累加后赋给了total变量。

2.for-in循环

编写awk程序文件,forin.awk:


  1. BEGIN { 
  2. X[1]= 50;  
  3. X[2]= 60;  
  4. X["last"]= 70;  
  5. for( any in X ) 
  6.     printf("X[%s] = %d\n", any, X[any] ) 

执行:


  1. awk -f forin.awk 

输出:


  1. X[2] = 60 
  2. X[last] = 70 
  3. X[1] = 50 

可以看到,在awk中的数组并不是按指定的顺序逐个输出的,而是乱序的。

循环相关指令

在awk中,与循环相关的指令包括:

  • 1.break 跳出循环
  • 2.continue 略过循环中尚未执行的语句
  • 3.next 略过其后的处理,读取下一行
  • 4.exit 停止执行程序

 下面举例说明:

1.break

编写awk程序文件,break.awk:


  1. BEGIN{ 
  2. x=1; 
  3. while(1) 
  4. print "Iteration"x; 
  5. if ( x==10 ) 
  6. break
  7. x++; 
  8. }} 

执行:


  1. awk -f break.awk 

输出:


  1. Iteration1 
  2. Iteration2 
  3. Iteration3 
  4. Iteration4 
  5. Iteration5 
  6. Iteration6 
  7. Iteration7 
  8. Iteration8 
  9. Iteration9 
  10. Iteration10 

说明:

while(1)是死循环,x在循环之外赋了初值为1,每循环一次x自加1,当x的值达到10时,跳出循环。

2.continue

编写awk程序文件,continue.awk:


  1. BEGIN { 
  2. for ( x=1; x<=8; x++ ) { 
  3. if ( x == 4 ) { 
  4. continue 
  5. print "iteration",x 

执行:


  1. awk -f continue.awk 

输出:


  1. iteration 1 
  2. iteration 2 
  3. iteration 3 
  4. iteration 5 
  5. iteration 6 
  6. iteration 7 
  7. iteration 8 

说明:

上面的程序在x等于4的时候执行了continue,结束了一次循环,少输出了一次,所以总共只输出了7条记录。

3.next

用之前的arr.dat文件来做测试:


  1. awk '{if($1 ~ /^10/){next}else{print}}' arr.dat 

输出:


  1. 1101 7:32 

说明:

第一列中以10开头的记录会被跳过,其余的会输出。

4.exit


  1. awk '{if($1 ~ /^11/){exit}else{print}}END {print "over";}' arr.dat 

输出:


  1. 1034 7:26  
  2. 1025 7:27 
  3. over 

说明:

如果第一列匹配11开头,就结束程序,在END段会输出over。可见exit并不会终止END段的执行。










本文转自 ustb80 51CTO博客,原文链接:http://blog.51cto.com/ustb80/1042989,如需转载请自行联系原作者
上一篇:【译】数据显示:中国的程序员是世界上最牛的程序员?


下一篇:python多线程之线程锁一(同一时间一个线程获得一把线程锁)