awk - 在 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
?
解决方案
来自 GNU awk手册
默认情况下,变量初始化为空字符串,如果转换为数字则为零。不需要在 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
这种方式应该适用于min
和max
,适用于任何范围的数字。通常,在编写脚本时,我们必须考虑所有可能的情况,即我们未定义和/或未初始化的变量将被初始化。对于在获得价值之前将进行测试的情况。
推荐阅读
- c++ - C ++在while循环中读取2行到地图?
- css - 在 CSS 类之间添加空格?
- javascript - HTML5 视频:如何用海报覆盖控制器
- json - 嵌套 JSON 与 SQL Server 中的现有视图 - 声明性 ORM SQLAlchemy 模型
- php - PHP 尝试获取 http://getURL 而不是 $_['getURL'] 分配给的内容
- r - 如何为因子的每个实例分配一个特定的值?
- powerbi - Power BI 的前一天
- callback - Glib - 直接执行 GCallback 的最简单方法是什么?
- java - 为什么从同一个类的另一个本地方法调用实例变量时,在实现接口的方法内部分配实例变量不起作用?
- api - http 应用程序使用 https web api - 它安全吗?