awk程序中允许使用字符串当做数组的下标(index)。利用这个特色十分有助于资料统计工作。(使用字符串当下标的数组称为Associative Array)

  首先建立一个数据文件,并取名为 reg.dat。此为一学生注册的资料文件;第一栏为学生姓名,其后为该生所修课程。

              

awk中数组的特性

  1. 使用字符串当数组的下标(index)。

  2. 使用数组前不须声明数组名及其大小。

  例如:希望用数组来记录 reg.dat 中各门课程的修课人数。这情况,有两项信息必须储存:

    (a) 课程名称,如: "O.S.","Arch.".. ,共有哪些课程事先并不明确。

    (b) 各课程的修课人数。 如:有几个人修"O.S."

  在awk中只要用一个数组就可同时记录上列信息。其方法如下:

  使用一个数组 Number[ ]:

    * 以课程名称当 Number[ ] 的下标。

    * 以 Number[ ] 中不同下标所对映的元素代表修课人数。

  例如:

    有2个学生修 "O.S.",则以 Number["O.S."] = 2 表示。

    若修"O.S."的人数增加一人,则 Number["O.S."] = Number["O.S."] + 1

                             或 Number["O.S."]++ 。

  3. 如何取出数组中储存的信息

  以 C 语言为例,声明 int Arr[100];之后,若想得知 Arr[ ]中所储存的数据,只须用一个循环,如:        

    for(i=; i<; i++)
      printf("%d\n", Arr[i]);

  即可。上式中:

    数组 Arr[ ] 的下标: 0, 1, 2,..., 99

    数组 Arr[ ] 中各下标所对应的值: Arr[0], Arr[1],...Arr[99]

  但 awk 中使用数组并不须事先声明。以刚才使用的 Number[ ] 而言,程序执行前,并不知将来有哪些课程名称可能被当成Number[ ]的下标。

  awk 提供了一个指令,通过该指令awk会自动查找数组中使用过的所有下标。以 Number[ ] 为例,awk将会找到 "O.S.","Arch.",...

使用该指令时,须指定所要查找的数组,及一个变量。awk会使用该变量来记录从数组中找到的每一个下标。例如        

    for(course in Number){
      ...
    }

  指定用 course 来记录 awk 从Number[ ] 中所找到的下标。awk每找到一个下标时,就用course记录该下标的值且执行{....}中的指令。通过这个方式便可取出数组中储存的信息。(详见下例)

范例:统计各科修课人数,并印出结果。

  建立如下程序,并取名为 course.awk:

    { for( i=; i <= NF; i++) Number[$i]++ }
    END{
      for(course in Number)
         printf("%10s %d\n", course, Number[course] )
    }

  执行下列命令:      

    $ awk -f course.awk reg.dat

  执行结果如下:

        

说 明:

  1. 这程序包含两个Pattern { Actions }指令。

Pattern Actions
  { for( i=2; i <= NF; i++) Number[$i]++ }
END { for(course in Number) printf("%10s %d\n", course, Number[course]) }

  2. 第一个Pattern { Actions }指令中省略了Pattern 部分。故随着每行数据的读入其Actions部分将逐次无条件被执行。以awk读入第一条记录 " Mary O.S. Arch. Discrete" 为例,因为该笔数据 NF = 4(有4个字段),故该 Action 的for Loop中i = 2,3,4。

i $i 最初 Number[$i] Number[$i]++ 之后
2 "O.S." AWK  default  Number["O.S."] = 0 1
3 "Arch." AWK  default  Number["Arch."] = 0 1
4 "Discrete" AWK  default  Number["Discrete"] = 0 1

  3. 第二个 Pattern { Actions }指令中

    * END 为awk的保留字,为 Pattern 的一种。

    * END 成立(其值为true)的条件是:"awk处理完所有数据,即将离开程序时。"

  平常读入数据行时,END并不成立,故其后的Actions 并不被执行;唯有当awk读完所有数据时,该Actions才会被执行(注意,不管有多少行数据,END仅在最后才成立,故该Actions仅被执行一次。)

  BEGIN 与 END 有点类似,是awk中另一个保留的Pattern。唯一不同的是:

    "以 BEGIN 为 Pattern 的 Actions 于程序一开始执行时,被执行一次。"

  4. NF 为awk的内置变量,用以表示awk正处理的数据行中,所包含的字段个数。

  5. awk程序中若含有以 $ 开头的自定变量,都将以如下方式解释:

  以 i= 2 为例,$i = $2 表第二个字段数据。 (实际上,$ 在 awk 中为一运算符(Operator),用以取得字段数据。)

【译】 AWK教程指南 5AWK中的数组的更多相关文章

  1. 【译】 AWK教程指南

    前面的话: 这几天写了一个程序,在同一个目录里生成了很多文件,需要统计其中部分文件的总大小,发现经常用到的ls.du等命令都无济于事,我甚至都想到了最笨的方法,写一个脚本:mkdir一个新目录,把要统 ...

  2. 【译】 AWK教程指南 1前言

    前面的话: 这几天写了一个程序,在同一个目录里生成了很多文件,需要统计其中部分文件的总大小,发现经常用到的ls.du等命令都无济于事,我甚至都想到了最笨的方法,写一个脚本:mkdir一个新目录,把要统 ...

  3. 【译】 AWK教程指南 附录D-AWK的内置变量

    因内置变量的个数不多,此处按其相关性分类说明,并未按其字母顺序排列. ARGC ARGC表示命令行上除了选项 -F, -v, -f 及其所对应的参数之外的所有参数的个数.若将"awk程序&q ...

  4. 【译】 AWK教程指南 10编写可与用户交互的AWK程序

    执行awk程序时,awk会自动从文件中读取数据来进行处理,直到文件结束.只要将awk读取数据的来源改成键盘输入,便可设计与awk 交互的程序.本节将提供一个该类程序的范例. 范例:本节将编写一个英语生 ...

  5. 【译】 AWK教程指南 2概述

    2.1 为什么用AWK 由于awk具有上述特色,在问题处理的过程中,可轻易使用awk来撰写一些小工具:这些小工具并非用来解决整个大问题,它们只扮演解决个别问题过程的某些角色,可通过Shell所提供的p ...

  6. 【译】 AWK教程指南 6在AWK程序中使用Shell命令

    awk程序中允许调用Shell指令,并提供管道解决awk与系统间数据传递的问题.所以awk很容易使用系统资源,读者可利用这个特点来编写某些适用的系统工具. 范例:写一个awk程序来打印出线上人数. 将 ...

  7. 【译】 AWK教程指南 3计算并打印文件中指定的字段数据

    awk 处理数据时,它会自动从数据文件中一次读取一条记录,并会将该记录切分成一个个的字段:程序中可使用 $1, $2,... 直接取得各个字段的内容.这个特色让使用者易于用 awk 编写 reform ...

  8. 【译】 AWK教程指南 附录C-AWK的内建函数

    C.1 字串函数 index( 原字串, 查找的子字串 ) 若原字串中含有欲寻找的子字串,则返回该子字串在原字串中第一次出现的位置,若未曾出现该子字串则返回0. 例如: $ awk 'BEGIN{ p ...

  9. 【译】 AWK教程指南 附录B-Actions

    Actions 是由下列指令(statement)所组成: 表达式 ( 函数调用,赋值...) print 表达式列表 printf( 格式化字符串, 表达式列表) if( 表达式 ) 语句 [els ...

随机推荐

  1. UINavigationController 总结

    一 . UINavigationBar 1.获取 UINavigationBar 对象: [UINavigationBar appearance] ,可以通过该方法对全部 navigation 进行设 ...

  2. C#中字符串驻留技术

    转自:http://www.cnblogs.com/Charles2008/archive/2009/04/12/1434115.html MSDN概念:公共语言运行库通过维护一个表来存放字符串,该表 ...

  3. yum安装gcc

    如果服务器是自己的,并且机器就在身边,那什么都不用说了,缺少gcc顶多就是重新放入安装盘,把开发工具包安装上.但是如果是租的服务器,托管服务 方那帮人又搞不懂你说的啥子gcc,要安装gcc实在是太麻烦 ...

  4. ExtJS4.2学习(11)可拖放的表格(转)

    鸣谢:http://www.shuyangyang.com.cn/jishuliangongfang/qianduanjishu/2013-11-18/180.html --------------- ...

  5. The 6th Zhejiang Provincial Collegiate Programming Contest->Problem I:A Stack or A Queue?

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3210 题意:给出stack和queue的定义,一个是先进后出(FILO), ...

  6. [Ruby on Rails系列]2、开发环境准备:Ruby on Rails开发环境配置

    前情回顾 上次讲到Vmware虚拟机的安装配置以及Scientific Linux 6.X系统的安装.这回我们的主要任务是在Linux操作系统上完成Ruby on Rails开发环境的配置. 在配置环 ...

  7. linux 5.5 开xmanager远程

    http://bbs.cqsztech.com/dv_rss.asp?s=xhtml&boardid=3&id=11&page=9 linux 5.5 开xmanager远程 ...

  8. linux 深入检测io详情的工具iopp

    1.为什么推荐iopp iotop对内核及python版本都有一定要求,有时候无法用上,这时候就可以使用iopp作为替代方案.在有些情况下可能无法顺利使用iotop,这时候就可以选择iopp了.它的作 ...

  9. codeforces #310 div1 C

    操作无论是U还是L,都会使原图形分裂成两个图形,且两个图形的操作互不影响 我们又发现由于操作点只可能在下斜线上,如果将操作按x排序 那么无论是U还是L,都会将操作序列完整分割成两半,且两个操作序列互不 ...

  10. codeforces #309 div1 D

    求最小值最大显然是要二分 二分之后转换成了判定性问题 我们考虑哪些点一定不能选 显然是将所有可选点选中之后依然不满足条件的点不能选 那么我们不妨维护一个堆,每次取出堆顶看看是否满足条件 不满足条件就p ...