在awk中分配之前进行变量评估

时间:2020-10-01 19:29:11

标签: awk

在以下awk语句中:

awk '$2 > maxrate {maxrate = $2; maxemp = $1} 
     END {print "highest hourly rate:", maxrate, "for", maxemp}' pay.data

运行以下数据:

Beth 4.00 0
Dan 3.75 0
Kathy 4.00 10
Mark 5.00 20
Mary 5.50 22
Susie 4.25 18

$2 > maxrate是如何工作的,因为它是在分配给$2之前被评估的?

2 个答案:

答案 0 :(得分:5)

从GNU awk manual

默认情况下,变量被初始化为空字符串,即 如果转换为数字,则为零。无需明确 在awk中初始化变量,这就是您在C和 其他大多数传统语言。

这种通常用于脚本语言的隐式方式非常舒适,但也留有出错或混淆的空间。


例如,在这种情况下,您可以计算最大值,而无需初始化max

awk '$2 > max{max = $2} END{print "max:", max}' file
max: 5.50

但是如果对min执行相同操作,则会得到空字符串,因为min最初是数字零,而字符串是空。

awk '$2 < min{min = $2} END{print "min:", min}' file
min: 

如果我们所有值均为负,则max计算也可能失败。因此最好确定是第一次分配一些东西。

awk 'NR==1{min=$2; next} $2<min{min = $2} END{print "min:", min}' file
min: 3.75

对于任何范围的数字,此方法都应同时适用于minmax。通常,在编写脚本时,我们必须考虑所有可能的情况,即未定义和/或未初始化的变量将被初始化。并且在获得价值之前将对其进行测试。

答案 1 :(得分:4)

默认情况下,如果您没有为awk中的变量分配任何值,则其默认值为null(无需明确提及变量,我们可以直接在awk中为其分配值),因此,您的第一次条件是与null相比较,因此它为true,然后进入块内部以执行进一步的语句(其中,在块内部将maxrate分配给第二个字段)。

在第一次执行后,当变量maxrate在其中获得第二个字段值,然后在下一行开始时,它将第一行的第二个字段值与当前行的第二个字段进行比较,并继续执行相同操作,直到读取Input_file的所有行。最后,在代码的END部分中将其打印出来。