awk循环

来源:互联网 发布:linux 设置用户根目录 编辑:程序博客网 时间:2024/06/07 23:03

循环的功能是:当测试表达式的条件为真时,重复执行表达式后面的语句。循环常常被用来对记录中的每个字段重复执行某种操作,或者在END块中用来循环处理某个数组中的所有元素。awk有3种类型的循环:while 循环、for循环和特殊for循环。


1. while循环
使用while循环的第一步是给一个变量设初值,然后在while表达式中测试该变量。如果求得表达式的值为真(非0),则进入循环体执行其中的语句。如果循环体内有多条语句,就必须用花括号把这些语句括起来。循环块结束之前,一定要更新用来控制循环表达式的变量,否则循环将无休止地进行下去。下面这个例子中,每处理一条新记录,循环控制变量就会被重置一次。
do/while循环与while 循环很相似,唯一的区别在于do/while要先执行循环体至少一次,然后才测试表达式。
范例

$ awk '{i=1; while(i<=NF){print NF,$i; i++ }}'filename

说明
变量i被初始化为1 ;当i小于或等于记录的字段数(NF)时,先执行print语句,然后将i加1。接下来又重新测试表达式,直至i大于NF的值。变量i要在awk开始处理下一条记录时被重置。


2. for循环
for循环和while循环基本相同,只不过for循环的圆括号中需要3个表达式,前两个分别是初始化表达式和测试表达式,第3个则用于更新测试表达式所用的变量。在awk的for循环中,圆括号里的第一条语句只能初始化一个变量(C语言中与之对应的语句则可以用逗号分隔的形式初始化多个变量)。

范例

$ awk '{for(i=1;i<=NF;i++) print NF,$i}' filename

说明:变量i被初始化为1,然后测试它是否小于或等于记录的字段数目(NF)。若是,print函数便打印出NF 和$i的值($i代表第i个字段),然后将i加1 (for循环经常会在END操作中与数组一同使用,循环处理数组的所有元素)。


3. 特殊for循环

当下标为字符串或非连续的数字时,不能用for循环来遍历数组。这时候就要使用特殊for循环。特殊for循环把下标作为键来查找与之关联的值。

格式

$ awk '{
  for(item in arrayname){
    print arrayname[item]
  }
}'

范例

cat db
1 Tom Jones
2 Mary Adams
3 Sally Chang
4 Billy B1ack
5 Tom Savaqe
6 Tom Chung
7 Reqqie Steel
8 Tommy Tucker
$ awk '/^Tom/{name[NR]=$1}END{for(i=1;i<=NR;i++)print name[i]}' db
Tom



Tom
Tom

Tommy

说明:如果在输入行的行首匹配到正则表达式Tom,就为数组name赋一个值。NR值(当前记录号),将作为name数组的索引。在每一行上匹配到Tom时,name数组就赋一个第一个字段($1)的值,当到达END块时,name数组仅包含name[l],name[5],name[6],name[8]这4个元素。因此,当使用for循环打印name数组的值时,索引2、3 、4、7为空。


参考文章:

http://www.linuxawk.com/jiaocheng/233.html

http://www.linuxawk.com/jiaocheng/260.html



while循环

0 0