AWK程序执行逻辑问询:输入、代码与结果的原理解析
AWK脚本执行逻辑疑问解答
输入数据
2018 Fiat 125 2018-01-17: Opel 2 Volvo 3 2017-01-21: Fiat 5 Fiat 6 2017-02-22: Opel 7 Fiat 8 2018-01-31: Fiat 9 Opel 17
AWK脚本代码
$1 !~ /17/ {t[$2]+= $3;} END {for (i in t) print i": "t[i];}
运行结果
Fiat: 134
疑问解答
条件
$1 !~ /17/的匹配范围
你的判断是对的,这个条件只匹配第一行和最后一行:- 第一行的第一个字段
$1是2018,不含17,符合条件; - 最后一行的
$1是2018-01-31,也不含17,符合条件; - 其余行的
$1都包含17(比如第二行的2018-01-17:、第三行的2017-01-21:),所以不会执行后续的累加操作。
- 第一行的第一个字段
语句
t[$2]+= $3的执行逻辑
这是AWK关联数组的累加操作:- 第一行执行时,
$2是Fiat,$3是125。AWK中未初始化的数组元素默认值为0,所以t["Fiat"] = 0 + 125 = 125; - 最后一行执行时,
$2还是Fiat,$3是9,此时t["Fiat"]已有值125,所以累加后变成125 + 9 = 134,这就是最终结果的由来。
- 第一行执行时,
变量
i的含义
在END块的for (i in t)循环里,i是关联数组t的键名。这里t数组只有一个键Fiat,所以循环会遍历这个键,然后输出键名i和对应的数组值t[i]。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

