awk中的数组
awk中的数组跟php中的很像,使用前都不需要声明,都可以用字符串做下标。
我们创建一个reg.dat文件来记录用户选修的课程:
- Mary O.S. Arch. Discrete Steve D.S. Algorithm Arch.
- Wang Discrete Graphics O.S. Lisa Graphics A.I.
- Lily Discrete Algorithm
现在要统计各课程被选的次数,亲,怎么办?
之前的程序都是用命令行完成的,从这一篇开始,我们学习将程序写在文件中来调用。
调用的方式是:
- awk -f awk程序文件 数据文件
下面创建一个course.awk文件,在里面编写如下的程序:
- {for(i=2;i<=NF;i++) Number[$i]++}
- END {for(course in Number) printf("%10s %d\n", course, Number[course])}
然后在命令行中调用:
- awk -f course.awk reg.dat
输出结果:
- Discrete 3
- D.S. 1
- O.S. 2
- Steve 1
- A.I. 1
- Lisa 1
- Graphics 2
- Arch. 2
- Algorithm 2
解释一下course.awk中的程序:
第一行是一个for循环,NF是一行的字段数,Number是一个数组,$i从第2列开始,直到一行最后一列,其实就是循环了一行的所有的课程,我们将课程名作为数组的下标,一旦有重复的课程,就会将Number[$i]加1。
第二行中的END表示的是在文件处理结束后进行的处理。这一行也有一个for循环,它是用于将Number数组格式化输出,for(course in Number)会逐个读取Number中的元素,读取的下标即course,值为Number[course]。printf完成下标与值的格式化输出。
其实在之前的awk学习笔记(6)中介结不排序对数据去重的技巧时已经用到过数组了,只是没有系统的学习。
本文转自 ustb80 51CTO博客,原文链接:http://blog.51cto.com/ustb80/1034692,如需转载请自行联系原作者