awk基础知识(7)-变量

发布时间:2020-07-08编辑:脚本学堂
awk的变量,数值变量与字符串变量

linuxjishu/13830.html target=_blank class=infotextkey>awk的变量,数值变量与字符串变量。

数值变量
至今,我们不是打印字符串、整行就是特定字段。然而,awk还可以执行整数和浮点运算。使用数学表达式,可以很方便地编写计算文件中空白行数量的脚本
BEGIN   { x=0 }
/^$/    { x=x+1 }
END     { print "I found " x " blank lines. :}" }
在 BEGIN 块中,将整数变量 x 初始化成零。然后,awk 每次遇到空白行时,awk 将执行 x=x+1 语句,递增 x。
处理完所有行之后,执行 END 块,awk 将打印出最终摘要,指出它找到的空白行数量。

字符串化变量
awk 的优点之一就是“简单和字符串化”。我认为 awk 变量“字符串化”是因为所有 awk 变量在内部都是按字符串形式存储的。同时,awk 变量是“简单的”,因为可以对它执行数学操作,且只要变量包含有效数字字符串,awk 会自动处理字符串到数字的转换步骤。要理解我的观点,请研究以下示例:
x="1.01"
# We just set x to contain the *string* "1.01"
x=x+1
# We just added one to a *string*
print x
# Incidentally, these are comments :)
awk 将输出:
2.01

虽然将字符串值 1.01 赋值给变量 x,仍然可以对它加一。但在 bash 和 python 中却不能这样做。
首先,bash 不支持浮点运算。而且,如果 bash 有“字符串化”变量,它们并不“简单”;要执行任何数学操作,bash 要求我们将数字放到丑陋的 $( ) ) 结构中。
如果使用 python,则必须在对 1.01 字符串执行任何数学运算之前,将它转换成浮点值。虽然这并不困难,但它仍是附加的步骤。
如果使用 awk,它是全自动的,而那会使我们的代码又好又整洁。如果想要对每个输入行的第一个字段乘方并加一,可以使用以下脚本:
{ print ($1^2)+1 }

如果做一个小实验,就可以发现如果某个特定变量不包含有效数字,awk 在对数学表达式求值时会将该变量当作数字零处理。