在 awk 中赋值前的变量评估

Thi*_*man 4 awk

在以下 awk 语句中:

awk '$2 > maxrate {maxrate = $2; maxemp = $1} 
     END {print "highest hourly rate:", maxrate, "for", maxemp}' pay.data
Run Code Online (Sandbox Code Playgroud)

在以下数据上运行:

Beth 4.00 0
Dan 3.75 0
Kathy 4.00 10
Mark 5.00 20
Mary 5.50 22
Susie 4.25 18
Run Code Online (Sandbox Code Playgroud)

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

tha*_*isp 5

来自 GNU awk手册

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

这种通常适用于脚本语言的隐式方式非常舒适,但也为错误或混乱留下了空间。


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

awk '$2 > max{max = $2} END{print "max:", max}' file
max: 5.50
Run Code Online (Sandbox Code Playgroud)

但是如果你对你做同样的事情,min你会得到空字符串作为结果,因为min最初作为数字为零,作为字符串为空。

awk '$2 < min{min = $2} END{print "min:", min}' file
min: 
Run Code Online (Sandbox Code Playgroud)

另外,max计算可能会失败,如果我们有所有值负。所以最好是第一次分配一些东西。

awk 'NR==1{min=$2; next} $2<min{min = $2} END{print "min:", min}' file
min: 3.75
Run Code Online (Sandbox Code Playgroud)

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