2010年(17)
分类:
2010-09-21 12:41:33
数组在awk被称为关联数组(associative arrays),因为他的小标既可以是数字也可以是数字,下标通常又被称作键()key),且与对应的数组元素的值相关联。数组元素的键和值都存储在awk程序内部的一个表中,该表采用的是散列算法。基于此,数组元素存储不是顺序存储,如果将数组的内容显示出来,元素的排列数序也许跟想象中不一样。
和变量一样,数组也是被用到才创建,而且awk还能判定这个数组保存是数字还是字符串。根据使用时的上下文环境,数组元素被初始化为数字0或空字符串。数组的大小不声明,awk数组可用于从记录中收集信息,也可用于统计总数,计算词数,记录模式出现次数等应用。
1.关联数组的下标
使用变量作为数组索引范例
(1)awk '{name[x++]=$2;END{for (i=0;i
数组name的下标是用户自定义的标量x运算符++表名这是一个数值型的变量,awk将x初始化为0,且每次都是用x追加1,每条记录的第2个字段都将赋值给name中相应元素,END块使用for循环来循环处理数组,将从下标0 开始,依次打印数组元素的值,下标只是一个键,所以不必从0 开始。下标可以从人一直开始,数字或者字符串都可以
(2)awk '{id[NR]=$3};END{for x=1;x<=NR;x++)\
print id[x]} employees
awk变量NR保存当前记录的记录号,本例用NR作为下标,把每条记录的第3个字段赋值给数组中的相应元素。最后,for循环对数组进行循环处理,打印出保存在数组中的值。
2.特殊for循环
当下标为字符串或非连续的数字时,不能用for来遍历数组,这是就要使用特殊for循环,特殊for循环把下标作为键来查找与之关联的值。
awk '/^Tom/{name[NR]=$1};\
END{for (i=1;i<=NR;i++)print name[i]}' datafile
2.1用字符串作为数组下标
数组下标可以有包含单个字符或字符串的变量组成,如果是字符串,则必须用双引号引起来
#awk.sc script
1 /tom/ {count["tom"]++}
2 /mary/ {count["mary"]++}
3 END {print "there are " count["tom"] " tom in the file and "count["mary"]" mary in the file."}
(命令行)
awk -f awk.sc datafile3
There are 2 tom in the file and 4 mary in the file.
notes:1)数组count包含两个元素:count("tom")和count["mary"],这两个数组元素的初值都是0,媒体匹配到tom是,数组元素count("tom")都加1
2)同样的过程被应用于count["mary"].注意每行只会算一次,即便tom(或mary)在该行中出现多次
3)END模式打印出每个数组元素的值