awk的条件语句与高级语言相同,其实就下面的四种
先创建一个测试文件,student-marks:
- Jones 2143 78 84 77
- Gondrol 2321 56 58 45
- RinRao 2122 38 37
- Edwin 2537 87 97 95
- Dayan 2415 30 47
1)现在要找出缺少某一科或某几科成绩的名单:
- awk '{if($3==""||$4==""||$5=="") print $1, "score missing"}' student-marks
可以看到,if语句的用法跟C或php是一样的。
输出结果:
- RinRao score missing
- Dayan score missing
2)标识出所有考试全及格的和不及格的名单,及格的在其后追加显示"PASS",有一门或几科不及格的在其后显示"FAIL"。
首先创建一个awk脚本,check-marks.awk:
- {
- if ($3 >=60 && $4 >= 60 && $5 >= 60)
- print $0,"=>","PASS";
- else
- print $0,"=>","FAIL";
- }
然后执行:
- awk -f check-marks.awk student-marks
输出的结果是:
- Jones 2143 78 84 77 => PASS
- Gondrol 2321 56 58 45 => FAIL
- RinRao 2122 38 37 => FAIL
- Edwin 2537 87 97 95 => PASS
- Dayan 2415 30 47 => FAIL
3)计算每个学生的平均成绩并评级,90分以上的是A,80-90是B,70-80是C,70以下是D。
首先创建awk脚本,grade.awk:
- {
- total = $3 + $4 + $5;
- avg = total / 3;
- if(avg >= 90) grade="A";
- else if(avg >= 80) grade="B";
- else if(avg >= 70) grade="C";
- else grade="D";
- print $0, "=>", grade;
- }
执行:
- awk -f grade.awk student-marks
输出结果:
- Jones 2143 78 84 77 => C
- Gondrol 2321 56 58 45 => D
- RinRao 2122 38 37 => D
- Edwin 2537 87 97 95 => A
- Dayan 2415 30 47 => D
4)更改文件格式,要求每输出三名学生的记录就换行。
- awk 'ORS=NR%3?",":"\n"' student-marks
输出结果:
- Jones 2143 78 84 77,Gondrol 2321 56 58 45,RinRao 2122 38 37
- Edwin 2537 87 97 95,Dayan 2415 30 47,
解释一下:?:是三目运算符,跟C和php中是一样的,ORS是记录的分隔符,默认是换行符(\n),NR是行号,%3是取模。上面的程序的意思是,当行号能被3整除时就输出\n换行,否则就输出逗号。因为没有指明action,默认是输出整条记录。
更多的内置变量可以参看awk学习笔记(5) - 改变分隔符。