awk中的循环包括以下几种:
- 1.do-while
- 2.while
- 3.for
下面依次举例说明:
do-while
创建dowhile.awk,内容如下:
- BEGIN {do{
- print "Enter y or n ! "
- getline data
- } while( data !~ /^[YyNn]$/)}
调用:
- awk -f dowhile.awk
输出:
- Enter y or n !
当输出y或n的时候(大小写均可)程序退出,其余情况会要求再次输入。
while
创建测试文件address.dat,这是一个通讯录:
- 张三
- 13512345678
- zhangsan@163.com
- 新浪
- 李四
- 13811111111
- lisi@google.com
- 百度
每4行是一组记录,用一个空行间隔开来,现在要整理成每一行是一组记录,下面是整理程序format-address.awk:
- BEGIN {
- FS="\n"
- RS=""
- ORS=""
- }
- {
- x=1
- while ( x<NF ) {
- print $x "\t"
- x++
- }
- print $NF "\n"
- }
执行:
- awk -f format-address.awk address.dat
输出:
- 张三 13512345678 zhangsan@163.com 新浪
- 李四 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,内容如下:
- 12 23 34 45 56
- 34 56 23 45 23
编写awk程序文件,for.awk:
- {
- for (i = 1; i <= NF; i++)
- total = total+$i
- }
- END { print total }
执行:
- awk -f for.awk number.txt
输出:
- 351
说明:
上面的程序实际上是求数据的总和,读取每一行,将每一行的数值累加后赋给了total变量。
2.for-in循环
编写awk程序文件,forin.awk:
- BEGIN {
- X[1]= 50;
- X[2]= 60;
- X["last"]= 70;
- for( any in X )
- printf("X[%s] = %d\n", any, X[any] )
- }
执行:
- awk -f forin.awk
输出:
- X[2] = 60
- X[last] = 70
- X[1] = 50
可以看到,在awk中的数组并不是按指定的顺序逐个输出的,而是乱序的。
循环相关指令
在awk中,与循环相关的指令包括:
- 1.break 跳出循环
- 2.continue 略过循环中尚未执行的语句
- 3.next 略过其后的处理,读取下一行
- 4.exit 停止执行程序
下面举例说明:
1.break
编写awk程序文件,break.awk:
- BEGIN{
- x=1;
- while(1)
- {
- print "Iteration"x;
- if ( x==10 )
- break;
- x++;
- }}
执行:
- awk -f break.awk
输出:
- Iteration1
- Iteration2
- Iteration3
- Iteration4
- Iteration5
- Iteration6
- Iteration7
- Iteration8
- Iteration9
- Iteration10
说明:
while(1)是死循环,x在循环之外赋了初值为1,每循环一次x自加1,当x的值达到10时,跳出循环。
2.continue
编写awk程序文件,continue.awk:
- BEGIN {
- for ( x=1; x<=8; x++ ) {
- if ( x == 4 ) {
- continue
- }
- print "iteration",x
- }
- }
执行:
- awk -f continue.awk
输出:
- iteration 1
- iteration 2
- iteration 3
- iteration 5
- iteration 6
- iteration 7
- iteration 8
说明:
上面的程序在x等于4的时候执行了continue,结束了一次循环,少输出了一次,所以总共只输出了7条记录。
3.next
用之前的arr.dat文件来做测试:
- awk '{if($1 ~ /^10/){next}else{print}}' arr.dat
输出:
- 1101 7:32
说明:
第一列中以10开头的记录会被跳过,其余的会输出。
4.exit
- awk '{if($1 ~ /^11/){exit}else{print}}END {print "over";}' arr.dat
输出:
- 1034 7:26
- 1025 7:27
- over
说明:
如果第一列匹配11开头,就结束程序,在END段会输出over。可见exit并不会终止END段的执行。