awk的工作流程 :

 

执行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

printawk所提供的输出指令会将数据输出到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},直到最后一行