Linux awk命令详解3

 数组和记录
上面的例子讲述怎样通过s p l i t函数使用数组。也可以预先定义数组,并使用它与域进行比较测试,下面的例子中将使用更多的数组。
下面是从空手道数据库卸载的一部分数据,包含了学生级别及是否是成人或未成年人的信息,有两个域,分隔符为( #),文件如下:

  1. [sam@Linux_chenwy sam]$ cat grade_student.txt
  2. Yellow#Junior
  3. Orange#Senior
  4. Yellor#Junior
  5. Purple#Junior
  6. Brown-2#Junior
  7. White#Senior
  8. Orange#Senior
  9. Red#Junior
  10. Red#Junior
  11. Brown-2#Senior
  12. Yellow#Senior
  13. Red#Junior
  14. Blue#Senior
  15. Green#Senior
  16. Purple#Junior
  17. White#Junior
复制代码
脚本功能是读文件并输出下列信息。
1) 俱乐部中Ye l l o w、O r a n g e和R e d级别的人各是多少。
2 ) 俱乐部中有多少成年人和未成年人。

查看文件,也许2 0秒内就会猜出答案,但是如果记录超过6 0个又怎么办呢?这不会很容易就看出来,必须使用a w k脚本。
首先看看a w k脚本,然后做进一步讲解。
  1. [sam@Linux_chenwy sam]$ cat belts.awk
  2. #!/bin/awk -f
  3. #name:belts.awk
  4. #to call:belts.awk grade2.txt
  5. #loops through the grade2.txt file and counts how many
  6. #belts we have in (yellow,orange,red)
  7. #also count how many adults and juniors we have
  8. #
  9. #start of BEGIN
  10. #set FS and load the arrays with our values
  11.  
  12. #B E G I N部分设置F S为符号#,即域分隔符 
  13.  
  14. BEGIN{FS="#"
  15.  
  16. #Load the belt colours we are interested in only
  17. #因为要查找Ye l l o w、O r a n g e和R e d三个级别。
  18. #然后在脚本中手工建立数组下标对学生做同样的操作。
  19. #注意,脚本到此只有下标或元素,并没有给数组名本身加任何注释。
  20.  
  21. belt["Yellow"]
  22. belt["Orange"]
  23. belt["Red"]
  24. #end of BEGIN
  25. #load the student type
  26. student["Junior"]
  27. student["Senior"]
  28. }
  29.  
  30. ##初始化完成后, B E G I N部分结束。记住B E G I N部分并没有文件处理操作。
  31.  
  32. #loop thru array that holds the belt colours against field-1
  33. #if we have a match,keep a running total
  34.  
  35. #现在可以处理文件了。
  36. #首先给数组命名为c o l o r,使用循环语句测试域1级别列是否
  37. #等于数组元素之一(Ye l l o w、O r a n g e或R e d),
  38. #如果匹配,依照匹配元素将运行总数保存进数组。
  39.  
  40. {for (colour in belt)
  41. {if($1==colour)
  42. belt[colour]++}}
  43.  
  44. #loop thru array that holds the student type against
  45. #field-2 if we have a match,keep a runing total
  46.  
  47. #同样处理数组‘ S e n i o r _ o r _ j u n i o r’,
  48. #浏览域2时匹配操作满足,运行总数存入j u n i o r或s e n i o r的匹配数组元素。
  49.  
  50. {for (senior_or_junior in student)
  51. {if ($2==senior_or_junior)
  52. student[senior_or_junior]++}}
  53.  
  54. #finished processing so print out the matches..for each array
  55.  
  56. #E N D部分打印浏览结果,对每一个数组使用循环语句并打印它。
  57.  
  58. END{for (colour in belt )print "The club has ",belt[colour],colour,"Belts"
  59.  
  60. #注意在打印语句末尾有一个\符号,用来通知a w k(或相关脚本)命令持续到下一行,
  61. #当输入一个很长的命令,并且想分行输入时可使用这种方法。
  62.  
  63. for (senior_or_junior in student) print "The club has ",\
  64. student[senior_or_junior],senior_or_junior,"student"}
复制代码
运行脚本前记住要加入可执行权限
  1. [sam@Linux_chenwy sam]$ chmod u+x belts.awk
  2. [sam@Linux_chenwy sam]$ ./belts.awk grade_student.txt
  3. The club has  3 Red Belts
  4. The club has  2 Orange Belts
  5. The club has  2 Yellow Belts
  6. The club has  7 Senior student
  7. The club has  9 Junior student
复制代码

 

 

 


你可能感兴趣的:(shell,awk)