awk 中的循环和 C 语言中的类似,下面是几种语法形式,下面是几个实例。
1. 在一行上连续输出 10 个字符 'a' :$ awk 'BEGIN { while (count++ < 10) string = string"a"; print string; }'
aaaaaaaaaa 注意,BEGIN 不能漏,否则不能输出,这是因为 awk 是作用于输入文本的,而 BEGIN 是在所有作用于文本的内容之前的处理(预处理),因此它不依赖于输入文本,故而能将它范围内的结果输出来。同时,也不能偶写成:$ awk 'BEGIN { while (count++ < 10) print "a"; }' 这样的形式。如果写成这样,输出为每行一个字母 'a‘,这是因为 print 表达式打印后自带有换行功能。
2. do...while 示例:$ awk 'BEGIN { count = 1;
> do
> print "ouput at least once";
> while (count != 1) }'
ouput at least once
3. for 循环
测试文本:$ cat score.txt
beyes 10000 90 78 98
admin 10001 99 64 72
tony 10002 45 32 56
tom 10003 12 34 87
lilei 10004 48 25 70 运行输出:$ awk '{ for (i = 1; i <= NF; i++) total = total + i; } END {print total}' score.txt
75 上面命令中,因为每一行都是 5 个域,因此每一行的值是 1+2+3+4+5 = 15,共有 5 行,所以最后算得的记过是 15 * 5 = 75 。
4. 将每一行中的域倒序输出:$ awk 'BEGIN { ORS=""; } { for (i = NF; i > 0; i--) print $i, " "; print "\n"; }' score.txt
98 78 90 10000 beyes
72 64 99 10001 admin
56 32 45 10002 tony
87 34 12 10003 tom
70 25 48 10004 lilei 注意,上面的 ORS 被设置为空。这是因为 ORS 是输出记录的分隔符,如果不设置为空,那么在 print $i, " " 这条语句后会默认采用换行,这就将原本一行的记录分割为多行输出,而这种情况并不是我们想要的。
5. break 语句测试:$ awk 'BEGIN {count = 1; while(1) {
> print "Loop...";
> if (count == 5)
> break;
> count++;
> }}'
Loop...
Loop...
Loop...
Loop...
Loop...
6. continue 语句测试:
[Bash shell] 纯文本查看 复制代码 $ cat continue.awk
BEGIN {
count = 1;
while ( count <= 8) {
if ( count >= 5) {
count++;
continue;
}
print "Value of count", count;
count++;
}
}
运行输出:$ awk -f continue.awk
Value of count 1
Value of count 2
Value of count 3
Value of count 4 由输出可见,只输出了 4 行。
7. exit 语句:
exit 语句将导致退出整个脚本。测试代码:
[Bash shell] 纯文本查看 复制代码 $ cat exit.awk
BEGIN {
count = 1;
while (count <= 8) {
if (count == 5) {
exit;
}
print "Value of count", count;
count++;
}
}
运行输出:$ awk -f exit.awk
Value of count 1
Value of count 2
Value of count 3
Value of count 4 |