AWK数组索引数值比较异常:4168为何被判定小于50?
问题分析与解决
你的awk命令出现这个问题的核心原因是字符串与数值的比较逻辑差异:
- 数组索引
i来自字符串类型的time_,因此i本身是字符串类型。 - 直接执行
i < 50时,awk会按字符串字典序比较:字符串"4168"和"50"对比,第一个字符"4"的ASCII码小于"5",所以判定"4168" < "50"为真,最终输出了结果。
修正方法
要实现数值大小的比较,需要把字符串类型的i强制转换为数值,可通过+i或i+0的方式实现:
echo "29601 sc 20 0 608372 63680 46268 S 90.9 0.0 4168:30 vcs1" \ |awk '{time_=$(NF-1); gsub(/:.*/, "", time_); a[time_] = $0} END {for (i in a) { if(+i > 50) {print i, "--------" ,a[i]}}}'
修改后,+i会将字符串"4168"转换为数值4168,此时按数值逻辑比较,4168 > 50成立,就能输出你预期的内容;如果保留+i < 50,则不会输出该结果。
内容的提问来源于stack exchange,提问作者Mạch Điện Tử
相关产品推荐
相关产品推荐

