现在我们来看一些例子,它们以变量NR开头。将前面计算平均成绩的脚本中的print语句修改为:
$ cat grades
john 85 92 78 94 88
andrea 89 90 75 90 86
jasper 84 88 80 92 84
$ cat grades.awk
#求5个成绩的平均值
{ total = $2 + $3 + $4 + $5 + $6
avg = total / 5
print NR ".", $1 , avg }
运行修改过的脚本输出如下结果:
$ awk -f grades.awk grades
1. john 87.4
2. andrea 86
3. jasper 85.6
当读入最后一行后, NR的值是读入的输入记录的个数。它可用于END过程中来产生总结报告。下面是phonelist.awk脚本修改过的版本。
$ cat names
John Robinson, Koren Inc.,978 4th
Ave.,Boston,MA
01760,696-0987
Phyllis Chapman, GVE Corp.,34 Sea
Drive, Amesbury,MA
01881,879-0900
$ cat phonelist.awk
# phonelist.awk -打印名字和电话号码。
#输入文件一一名字、公司、街道、城市、州和邮编、电话
BEGIN { FS = ",
*" } #用逗号分隔字段
{ print $1 ",
" $6 }
END { print ""
print NR, "records
processed. " }
这个程序修改了默认的字段分隔符,并使用NR打印记录的总数。注意,这个程序使用了一个正则表达式。程序执行的输出结果如下:
$ awk -F, -f phonelist.awk
names
John Robinson, 696-0987
Phyllis Chapman, 879-0900
2 records processed.
当在print语句中用逗号分隔参数时,将产生输出字段分隔符(OFS)。你或许会对下面的表达式中逗号将起什么作用产生疑问:
print NR ".", $1 , avg
默认情况下,逗号将在输出中产生一个空格(OFS的默认值)。例如,你可以使用BEGIN过程将OFS重定义为制表符。那么前面的print 语句将产生如下输出:
$ awk -f grades.awk grades
1. john 87.4
2. andrea 86
3. jasper 85.6
如果输入字段由制表符分隔,并且希望产生相同的输出时,这种方法特别有用。OFS可以重定义为一系列字符,例如逗号后面跟一个空格。
另一个常用的系统变量是NF,它的值被设置为当前记录的字段个数。就像我们将在下一部分看到的那样,可以用NF来测试一个记录的字段个数是否与所期望的相同。也可以用NF来引用每个记录的最后一个字段。使用"$"字段操作符和NF可以实现该引用。如果有6个字段,那么"$NF"与"$6"一样。
参考资料:http://www.linuxawk.com/communication/494.html