脱掉内衣

awk脚本

在上面我们可以看到一个END关键字。END的意思是“处理完所有的行的标识”,即然说到了END就有必要介绍一下BEGIN,这两个关键字意味着执行前和执行后的意思,语法如下:

  • BEGIN{ 这里面放的是执行前的语句 }
  • END {这里面放的是处理完所有的行后要执行的语句 }
  • {这里面放的是处理每一行时要执行的语句}

为了说清楚这个事,我们来看看下面的示例:

假设有这么一个文件(学生成绩表):

  1. $ cat score.txt
  2. Marry 2143 78 84 77
  3. Jack 2321 66 78 45
  4. Tom 2122 48 77 71
  5. Mike 2537 87 97 95
  6. Bob 2415 40 57 62

我们的awk脚本如下(我没有写有命令行上是因为命令行上不易读,另外也在介绍另一种用法):

  1. $ cat cal.awk
  2. #!/bin/awk -f
  3. #运行前
  4. BEGIN {
  5. math = 0
  6. english = 0
  7. computer = 0
  8. printf "NAME NO. MATH ENGLISH COMPUTER TOTAL\n"
  9. printf "---------------------------------------------\n"
  10. }
  11. #运行中
  12. {
  13. math+=$3
  14. english+=$4
  15. computer+=$5
  16. printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5
  17. }
  18. #运行后
  19. END {
  20. printf "---------------------------------------------\n"
  21. printf " TOTAL:%10d %8d %8d \n", math, english, computer
  22. printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
  23. }

我们来看一下执行结果:(也可以这样运行 ./cal.awk score.txt)

  1. $ awk -f cal.awk score.txt
  2. NAME NO. MATH ENGLISH COMPUTER TOTAL
  3. ---------------------------------------------
  4. Marry 2143 78 84 77 239
  5. Jack 2321 66 78 45 189
  6. Tom 2122 48 77 71 196
  7. Mike 2537 87 97 95 279
  8. Bob 2415 40 57 62 159
  9. ---------------------------------------------
  10. TOTAL: 319 393 350
  11. AVERAGE: 63.80 78.60 70.00

环境变量

即然说到了脚本,我们来看看怎么和环境变量交互:(使用-v参数和ENVIRON,使用ENVIRON的环境变量需要export)

  1. $ x=5
  2. $ y=10
  3. $ export y
  4. $ echo $x $y
  5. 5 10
  6. $ awk -v val=$x '{print $1, $2, $3, $4+val, $5+ENVIRON["y"]}' OFS="\t" score.txt
  7. Marry 2143 78 89 87
  8. Jack 2321 66 83 55
  9. Tom 2122 48 82 81
  10. Mike 2537 87 102 105
  11. Bob 2415 40 62 72