现有的答案很有帮助,并且涵盖了所有方面,但我想我会给出一个更集中的总结。
这个问题把两个方面混为一谈:
- 通常在 Awk 中初始化数组
- 这样做是为了特别填充二维数组
数组初始化:
awk没有数组字面量(初始化器)语法。
最简单的解决方法是:
- 将数组元素表示为单个字符串,并且
- 使用该
split()
函数将该字符串拆分为数组的元素。
$ awk 'BEGIN { n=split("Red Green Blue", arr); for (i=1;i<=n;++i) print arr[i] }'
Red
Green
Blue
这就是 OP 在他们自己的有用答案中所做的。
如果元素本身包含空格,请使用不属于数据的自定义分隔符,|
在此示例中:
$ 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); for (i in arrAux) Colors[1,i] = arrAux[i]
n=split("Yellow Cyan Purple", arrAux); for (i in arrAux) Colors[2,i] = arrAux[i]
print Colors[1,2]
print "---"
# Enumerate all [2,*] values - see comments below.
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])
# NOTE: Always use *separate* indices: [1][2] instead of [1,2]
print Colors[1][2]
print "---"
# Enumerate all [2][*] values
for (i in Colors[2]) print Colors[2][i]
}'
笔记: