使用字段的值作为数组下标

对于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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值