awk的工作流程 :
1、自动从指定的数据文件中读取一个数据行(记录).
2、自动更新(Update)相关的内建变量之值. 如 : NF, NR, $0...
3、依次执行程序中 所有的Pattern { Actions } 指令.
4、当执行完程序中所有 Pattern { Actions } 时, 若数据文件中还有未读取的数据行, 则反复执行步骤1到步骤4.
awk会自动重复进行上述4个步骤, 使用者不须于程序中编写这个循环 (Loop).
文件emp.dat
A125 Jenny 100 210
A341 Dan 110 215
P158 Max 130 209
P148 John 125 220
A123 Linda 95 210
例子:
1、 打印文件中指定的字段数据并加以计算
计算每人应发工资并打印报表.
Awk ‘{print $2,$3*$4}’ emp.dat
执行结果:
Jenny 21000
Dan 23650
Max 27170
John 27500
Linda 19950
本例中pattern{actions}语法中,省略了pattern表示无条件的执行actions
print为awk所提供的输出指令, 会将数据输出到stdout(屏幕).print 的参数间彼此以 "," (逗号) 隔开, 印出数据时彼此间会以空白隔开. (输出分隔符参考内建变量OFS)
2、选择符合指定条件的记录
Pattern { Action }为awk中最主要的语法. 若某Pattern之值为真则执行它后方的 Action。
组装部门员工调薪5%,(组装部门员工之ID以"A"开头)
所有员工最后之薪资率若仍低于100, 则以100计.
编写awk程序打印新的员工薪资率报表.’’
awk '$1 ~ /^A.*/ { $3 *= 1.05 } $3<100 { $3 = 100 } { printf("%s %8s %d\n", $1, $2, $3)}' emp.dat
输出结果:
A125 Jenny 105
A341 Dan 115
P158 Max 130
P148 John 125
A123 Linda 100
Awk读取文件一行,然后执行所有pattern{actions}:
$1~/^A.*/ { $3 *= 1.05 }:如果第一个字段以A开头,则将第三个字段的值*1.05
$3 < 100 { $3 = 100 }:如果第三个字段小于100则将第三个字段赋值100
{printf("%s %8s %d\n",$1,$2,$3)}:打印第一、二、三字段,%8s 8表示占用宽度,此处省略pattern,无条件执行,所以打印输出调整后所有后的行
Awk在读取一行,执行上面的三个pattern{actions},直到最后一行