awk的条件语句与高级语言相同,其实就下面的四种

  1. if
  2. else if
  3. else
  4. ?:

先创建一个测试文件,student-marks:

 
  1. Jones 2143 78 84 77 
  2. Gondrol 2321 56 58 45 
  3. RinRao 2122 38 37 
  4. Edwin 2537 87 97 95 
  5. Dayan 2415 30 47 

1)现在要找出缺少某一科或某几科成绩的名单:

 
  1. awk '{if($3==""||$4==""||$5=="") print $1, "score missing"}' student-marks  

可以看到,if语句的用法跟C或php是一样的。

输出结果:

 
  1. RinRao score missing 
  2. Dayan score missing 

2)标识出所有考试全及格的和不及格的名单,及格的在其后追加显示"PASS",有一门或几科不及格的在其后显示"FAIL"。

首先创建一个awk脚本,check-marks.awk:

 
  1. if ($3 >=60 && $4 >= 60 && $5 >= 60) 
  2.     print $0,"=>","PASS"
  3. else 
  4.     print $0,"=>","FAIL"

然后执行:

 
  1. awk -f check-marks.awk student-marks 

输出的结果是:

 
  1. Jones 2143 78 84 77 => PASS 
  2. Gondrol 2321 56 58 45 => FAIL 
  3. RinRao 2122 38 37 => FAIL 
  4. Edwin 2537 87 97 95 => PASS 
  5. Dayan 2415 30 47 => FAIL 

3)计算每个学生的平均成绩并评级,90分以上的是A,80-90是B,70-80是C,70以下是D。

首先创建awk脚本,grade.awk:

 
  1. total = $3 + $4 + $5; 
  2. avg = total / 3; 
  3. if(avg >= 90) grade="A"
  4. else if(avg >= 80) grade="B"
  5. else if(avg >= 70) grade="C"
  6. else grade="D"
  7.  
  8. print $0, "=>", grade; 

执行:

 
  1. awk -f grade.awk student-marks 

输出结果:

 
  1. Jones 2143 78 84 77 => C 
  2. Gondrol 2321 56 58 45 => D 
  3. RinRao 2122 38 37 => D 
  4. Edwin 2537 87 97 95 => A 
  5. Dayan 2415 30 47 => D 

4)更改文件格式,要求每输出三名学生的记录就换行。

 
  1. awk 'ORS=NR%3?",":"\n"' student-marks 

输出结果:

 
  1. Jones 2143 78 84 77,Gondrol 2321 56 58 45,RinRao 2122 38 37 
  2. Edwin 2537 87 97 95,Dayan 2415 30 47, 

解释一下:?:是三目运算符,跟C和php中是一样的,ORS是记录的分隔符,默认是换行符(\n),NR是行号,%3是取模。上面的程序的意思是,当行号能被3整除时就输出\n换行,否则就输出逗号。因为没有指明action,默认是输出整条记录。

更多的内置变量可以参看。