对于awk命令,任何表达式都可以用作数组的下标。所以,也可以用字段作下标。下面的例子中的程序用于计算所有名字在第2 个字段出现的次数,并引入了一种for循环的新形式。
for(index_value in array) statement
在前面介绍的例子中,END块中出现的for循环的工作过程如下:变量name被设为count数组的索引值,在每次for循环的迭代中,执行print操作,首先打印的是索引值,然后是保存在元素中的值(打印输出的次序无法确定)。
范例
$ cat datafile4
4234 Tom 43
4567 Arch 45
2008 Eliza 65
4571 Tom 22
3298 Eliza 21
4622 Tom 53
2345 Mary 24
$ awk ‘{count[$2]++}END{for(name in count)print name,count[name]}‘
Tom 3
Arch 1
Eliza 2
Mary 1
说明:这条awk语句首先用记录的第2个字段作为数组count的下标。数组的下标随第2个字段的变化而变化,所以数组count 的第一个下标是Tom。而count["Tom"]中保存的值是1。然后,count["Arch"]、count["Eliza"]和count["Mary"]相继被设为10当在第2个字段中再次出现Tom时,count["Tom"]的值将被加1,于是它目前的值是2。Arch、Eliza和Mary再次出现时其过程类似。
范例
$ awk ‘{dup[$2]++; if(dup[$2] > 1){name[$2]++}}\
END{print "The duplicates were"\
for(i in name){print i,name[i]}}‘ datafile4
Tom 2
Eliza 2
说明:数组dup的下标是第2个字段的值,即人名。dup数组中元素的值最初都是0,每处理一条记录,相应元素的值就加1。如果名字重复出现,则对应该下标的元素值就会变成2,并相应地逐渐增加。如果dup数组中某个元素的值大于1,就会创建一个名为name的新数组,也是以第2个字段的值作为下标,用于记录出现次数大于1的人名。
参考资料:http://www.linuxawk.com/jiaocheng/274.html