awk内置变量的应用

来源:互联网 发布:局域网视频网站源码 编辑:程序博客网 时间:2024/04/26 17:38

现在我们来看一些例子,它们以变量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

0 0
原创粉丝点击