awk学习笔记(10) - 数组

awk中的数组

awk中的数组跟php中的很像,使用前都不需要声明,都可以用字符串做下标。

我们创建一个reg.dat文件来记录用户选修的课程:

  
  
  
  
  1. Mary O.S. Arch. Discrete Steve D.S. Algorithm Arch. 
  2. Wang Discrete Graphics O.S. Lisa Graphics A.I. 
  3. Lily Discrete Algorithm 

现在要统计各课程被选的次数,亲,怎么办?

之前的程序都是用命令行完成的,从这一篇开始,我们学习将程序写在文件中来调用。

调用的方式是:

  
  
  
  
  1. awk -f awk程序文件 数据文件 

下面创建一个course.awk文件,在里面编写如下的程序:

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

然后在命令行中调用:

  
  
  
  
  1. awk -f course.awk reg.dat 

输出结果:

  
  
  
  
  1.  Discrete 3 
  2.      D.S. 1 
  3.      O.S. 2 
  4.     Steve 1 
  5.      A.I. 1 
  6.      Lisa 1 
  7.  Graphics 2 
  8.     Arch. 2 
  9. 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)中介结不排序对数据去重的技巧时已经用到过数组了,只是没有系统的学习。

你可能感兴趣的:(数组,awk学习笔记)