分类: LINUX
2010-03-19 17:24:20
前面一篇文章《awk示例(一)》最后提到本文开始讲解awk中的变量,下面首先来看数值变量。
awk允许我们执行整数和浮点运算。通过使用数学表达式,可以很方便地编写计算文件中空白行数量的脚本。以下就是这样一个脚本(test.awk):
BEGIN { x=0 }
/^$/ { x=x+1 }
END { print "I found " x " blank lines. :)" }
aaa ffsdf
假设test.in内容如下:
fffh gfg hgfhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhghgf gdfgdfg ggggggggggggggggggg hhhhhhhhhhh
ggggggggggg
则执行 awk -f test.awk test.in后,结果如下:
I found 4 blank lines. :)
在BEGIN块中,将整数变量x初始化成零。然后,awk每次遇到空白行时,awk 将执行x=x+1语句,递增x。处理完所有行之后,执行END块,awk将打印出最终摘要,指出它找到的空白行数量。
下面继续看字符串变量,只要变量包含有效数字字符串,awk 会自动处理字符串到数字的转换步骤。例如:
x="1.01"
x=x+1
{print x}
执行上面示例之后awk将输出2.01,可见虽然将字符串值 1.01 赋值给变量 x,我们仍然可以对它加一。同样,假设名为address.in的文件内容如下:
1:abc:male:13612345678
2:mary:female:12345678
3:aaa:female:44445555
4:zlx:female:13550000000
5:lucy:female:13611111111
6:david:male:10101010
则执行awk -F":" '{ print ($1^2)+1 }' address.in后将对每个输入行的第一个字段乘方并加一,结果如下:
2
5
10
17
26
37
若将address.in的最后一行改为end:david:male:10101010,则同样执行上述命令后结果将会变为:
2
5
10
17
26
1
注意上述结果的最后一行是1,从这个例子可以看出如果某个特定变量不包含有效数字,awk 在对数学表达式求值时会将该变量当作数字零处理。
对于运算符,除了标准的加、减、乘、除,awk 还允许使用前面演示过的指数运算符 "^"、模(余数)运算符 "%" 和其它许多从 C 语言中借入的易于使用的赋值操作符,在此不做详细介绍。好了,上面我们简单介绍了awk中用户自定义变量的使用,下篇文章开始讲解awk自己的特殊变量。