AIX 6.x环境下AWK构建数组后打印报错如何解决?
错误原因
AIX 6.x 系统默认自带的 awk 是传统 POSIX awk 实现,index 属于 awk 的内置保留函数,用于查找子字符串在目标字符串中的起始位置,不允许作为自定义变量名使用,这就是两次执行都报invalid subscript expression的核心原因。
除此之外你第一次写的命令还存在两处逻辑错误:
- 行处理规则中加了
next关键字,会直接跳过后续所有行处理逻辑,你写的for循环块永远不会被触发 - for循环的判断条件
index<=FS逻辑错误,FS是字段分隔符变量,不是数组长度或最大索引值
解决方法
把自定义变量名index替换为其他非保留字的名称即可,比如idx、i、emp_id都可以。
示例1:遍历输出所有员工记录(对应你第二次的需求)
awk 'BEGIN { FS="|" } { employee[$1]=$0 } END { for (idx in employee) { print employee[idx] } }' Employee.txt
示例2:按员工ID升序输出带序号的记录(对应你第一次的需求)
因为awk关联数组默认遍历顺序不固定,你的员工ID是连续的正整数,可以用C风格for循环按顺序输出:
awk 'BEGIN { FS="|" } { employee[$1]=$0; max_id = $1 > max_id ? $1 : max_id } END { for (i=1; i<=max_id; i++) print i ":" employee[i] }' Employee.txt
可选方案
AIX系统通常也预装了GNU awk,路径一般为/usr/bin/gawk,用gawk执行你原来的命令也可以正常运行,因为GNU awk允许使用内置函数名作为变量名,但该写法不符合可移植规范,不推荐使用。
内容的提问来源于stack exchange,提问作者George Jackson
相关产品推荐
相关产品推荐

