Chinaunix首页 | 论坛 | 博客
  • 博客访问: 68850
  • 博文数量: 17
  • 博客积分: 508
  • 博客等级: 下士
  • 技术积分: 180
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-20 12:56
文章分类
文章存档

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      print i,name[i]' employees
   数组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模式打印出每个数组元素的值

阅读(3664) | 评论(0) | 转发(0) |
0

上一篇:awk值程序控制语句

下一篇:awk的内置函数

给主人留下些什么吧!~~