现有的答案都很有帮助,并且涵盖了所有方面,但我想给出更加专注的总结。
这个问题混淆了两个方面:
- 在Awk中一般初始化数组
- 特别是用来填充二维数组。
数组初始化:
在Awk中没有数组字面值(初始化器)语法。
最简单的解决方法是:
- 将数组元素表示为单个字符串,并且
- 使用
split()
函数将该字符串分割成数组的元素。
$ awk 'BEGIN { n=split("Red Green Blue", arr); for (i=1;i<=n;++i) print arr[i] }'
Red
Green
Blue
这是楼主在 他们自己的有用回答 中所做的。
如果元素本身包含空格,请使用不属于数据的自定义分隔符,例如此示例中的 |
:
$ awk 'BEGIN { n=split("Red (1)|Green (2)", arr, "|"); for (i=1;i<=n;++i) print arr[i] }'
Red (1)
Green (2)
初始化二维数组:
符合 POSIX 标准的示例(类似于 TrueY 给出的有用答案):
awk 'BEGIN {
n=split("Red Green Blue", arrAux)
n=split("Yellow Cyan Purple", arrAux)
print Colors[1,2]
print "---"
for (i in Colors) { if (index(i, 2 SUBSEP)==1) print Colors[i] }
}'
Green
---
Yellow
Cyan
Purple
注意,使用复合键将多维数组模拟成一维数组具有以下不便之处:
GNU Awk 示例(类似于 Steve 给出的有用答案,但改进了 Ed Morton 的评论):
GNU Awk 对真正的多维数组的(非标准)支持使 POSIX 兼容解决方案的不便(大多数情况下)消失了(但 GNU Awk 也没有数组初始化器)。
gawk 'BEGIN {
Colors[1][""]; split("Red Green Blue", Colors[1])
Colors[2][""]; split("Yellow Cyan Purple", Colors[2])
print Colors[1][2]
print "---"
for (i in Colors[2]) print Colors[2][i]
}'
注意:
重要提示:如上所述,为了访问多维数组中的特定元素,请始终使用单独的索引;例如,使用 [1][2] 而不是 [1,2] 。
如果使用 [1,2] ,您将得到标准的 POSIX 规定行为,并且您将错误地创建一个新的、带有(字符串拼接)值的单个索引(键),即 1 SUBSEP 2 。
split() 可以方便地用于直接填充子数组。
但前提是,必须初始化二维目标数组:
Colors[1][""] 和 Colors[2][""] 就是这样做的。
虚拟索引 [""] 只是用来创建二维数组的;当 split() 填充该维度时,它被丢弃。
支持使用 for (i in ...) 枚举特定的维度:
for (i in Colors[2]) ... 方便地枚举 Colors[2] 的子索引。
SUBSEP
变量的内容替换。例如:gawk 'BEGIN {x[1,1]=1; for (i in x) printf "%s\n", i}' | xxd -g1
- glenn jackman