GNU awk中将数组作为另一数组元素,是否必须手动复制整个数组?
在GNU awk中实现数组作为另一个数组的元素
你遇到的错误是因为awk不允许将数组当作标量(单个值)赋值,multidimarray["ID" NR] = a试图把数组a当成普通字符串/数值存储,因此触发"attempt to use array a in a scalar context"错误。
以下是两种可行的解决方案:
方法1:直接拆分到目标多维数组(最简洁高效)
不需要中间数组,直接让split函数将结果写入multidimarray的子数组,一步到位实现需求:
echo X1 X2 X3 X4 | awk ' { # 直接将输入行拆分到multidimarray["ID" NR]子数组 split($0, multidimarray["ID" NR]) } # 验证结果的示例代码 END { print "multidimarray[\"ID1\"][1] =", multidimarray["ID1"][1] print "multidimarray[\"ID1\"][2] =", multidimarray["ID1"][2] print "multidimarray[\"ID1\"][3] =", multidimarray["ID1"][3] print "multidimarray[\"ID1\"][4] =", multidimarray["ID1"][4] } '
运行输出:
multidimarray["ID1"][1] = X1 multidimarray["ID1"][2] = X2 multidimarray["ID1"][3] = X3 multidimarray["ID1"][4] = X4
方法2:封装数组复制函数(替代手动循环)
如果必须保留中间数组a,可以封装一个通用的数组复制函数,避免重复编写循环逻辑:
echo X1 X2 X3 X4 | awk ' # 自定义函数:将src数组的所有键值对复制到dest数组 function array_copy(src, dest, k) { delete dest # 先清空目标数组,避免残留旧数据 for (k in src) dest[k] = src[k] } function dummy_split(arr) { split($0, arr) } { dummy_split(a) # 调用复制函数,将a的内容同步到multidimarray的子数组 array_copy(a, multidimarray["ID" NR]) } END { print multidimarray["ID1"][3] # 输出X3 } '
补充说明
GNU awk目前没有原生的一键数组复制语法(如dest = src),必须通过循环或封装函数完成数组内容的复制。但方法1通过直接拆分到目标子数组的方式,完全规避了复制步骤,是最推荐的实现方式。
内容的提问来源于stack exchange,提问作者Fravadona
相关产品推荐
相关产品推荐

