awk拆分CSV数组输出顺序异常及修改后丢失最后值求助
搞定awk数组遍历顺序的问题
咱们先把你遇到的问题拆解清楚:
为什么初始输出里Main1排在最后?
你用for (i in a)遍历split生成的数组时,awk的关联数组默认遍历顺序不是元素的插入顺序,而是由内部哈希算法决定的。split把字符串拆成数组后,索引1对应Main1,但awk遍历的时候不一定先拿到索引1,所以就出现了Main1最后输出的情况。
你修改后的命令为啥出问题?
你尝试用i-1来调整索引,但因为遍历顺序本身是乱的,而且当i等于1时,i-1是0,数组里根本没有索引0的元素,所以会输出空值;同时因为遍历的是原数组的索引,你用a[i-1]会漏掉原数组最后一个索引对应的元素,自然就丢值了。
正确的解决方法有两种:
方法1:按连续索引顺序遍历(最稳妥)
既然split生成的数组索引是从1开始的连续整数,咱们直接用普通for循环从1遍历到数组长度就行,这样绝对能保证顺序:
echo "Main1,one,two,three,four" | awk '{ split($1,a,","); for(i=1; i<=length(a); i++) print i, ")", a[i]; }'
执行后输出就是你想要的:
1 ) Main1
2 ) one
3 ) two
4 ) three
5 ) four
方法2:强制按索引升序遍历(GNU awk专属)
如果你用的是GNU awk(也就是gawk)4.0及以上版本,可以通过设置PROCINFO["sorted_in"]来指定遍历顺序,让数组按索引数字升序走:
echo "Main1,one,two,three,four" | awk '{ split($1,a,","); PROCINFO["sorted_in"] = "@ind_num_asc"; for(i in a) print i, ")", a[i]; }'
这种方法适合数组索引不连续,但需要按数字顺序遍历的场景,灵活性更高。
内容的提问来源于stack exchange,提问作者krishnakant
相关产品推荐
相关产品推荐

