我能够在 gawk 中正确执行此操作,但是当我尝试将代码发布到它将运行的机器时,我意识到它正在使用 mawk...
$ cat multidim.gawk
# test of multidimensional arrays
// {
A[1][1]="A11"
A[1][2]="A12"
A[2][1]="A21"
A[2][2]="A22"
i=2
for ( j in A[i] )
{
print "i=" i " j=" j " A[i][j]=" A[i][j]
}
}
$ echo hi | awk -f multidim.gawk
i=2 j=1 A[i][j]=A21
i=2 j=2 A[i][j]=A22
似乎 mawk 对于多维数组应该如何工作有不同的想法。当我在 Debian 上使用 mawk 运行它时,出现语法错误。 A[i,j] 似乎是正确的语法,它“合成”多维数组。
所以我尝试了两件事,但都不起作用:
$ cat multidim.mawk
// {
A[1,1]="A11"
A[1,2]="A12"
A[2,1]="A21"
A[2,2]="A22"
i=2
for ( j in A[i] )
{
print "i=" i " j=" j "a[i,j]=" a[i,j]
}
}
$ echo hi | awk -f multidim.mawk
awk: multidim.mawk: line 9: syntax error at or near [
似乎很明智,在“多维”数组上使用 1dim 数组索引会生成错误。
尝试遍历整个数组,以便我可以使用 if 语句来选择第一个维度(效率极低且可怕)...但我什至不能这样做!:
$ cat multidim2.mawk
# test of multidimensional arrays
// {
A[1,1]="A11"
A[1,2]="A12"
A[2,1]="A21"
A[2,2]="A22"
for ( (i, j) in A )
{
print "i=" i " j=" j "a[i,j]=" a[i,j]
}
}
$ echo hi | awk -f multidim2.mawk
awk: multidim2.mawk: line 8: syntax error at or near )
有没有办法在 mawk 中遍历多维数组?
除了 mawk 手册页之外还有其他语言参考吗?
谢谢!
答案1
mawk
(和nawk
)仅提供合成多维数组。
gawk
提供(从 4.0 开始,thx工作的人)真正的多维数组,尽管手册页(恕我直言)有点误导:在介绍(自 v4.1.1 起已修复!)。if ((i,j) in array)
它之后立即跟随“in 构造也可以用在 for 循环中来迭代数组的所有元素。“
但是,for ((i,j) in array)
这不是迭代这些的方法,方法gawk
是(正如您最初使用的那样):
for (i in array)
for (j in array[i])
print array[i][j]
与nawk
/mawk
你被困住了合成多维数组, 所以
for (ij in A) {
split(ij,xx,SUBSEP);
printf("A[%s,%s]=%s\n",xx[1],xx[2],A[ij])
}
现在,你的下一个问题将是订购,数组索引隐式为字符串类型,数组隐式无序。除非您对索引有单独的了解,就像具有从 0..N 的连续整数索引的简单非稀疏数组的情况一样。gawk
优惠一个有序的解决方案in
。
如果您知道合成数组的索引,那么您可以使用A[i,j]
(被视为A[i SUBSEP j]
), 或for
/和一些字符串分割来重建和in
的列表,或(测试是否存在,无需i
j
if ((i,j) in A)
自动活化的索引)。
如果gawk
您不能使用(i,j) in arr
其中 arr 是真正的多维数组,则需要将其分成两个(或任意多个维度)for
循环,如上所述。不过,为了完全正确,内部循环应该包含一个isarray()
条件,因为不需要每个元素arr[i]
依次都是数组,gawk 也很乐意允许标量。
据我所知,mawk
除了手册页,它的目标是成为一个标准的新awk
(即nawk
)实现(因此没有真正的多维数组,没有索引排序,也没有isarray()
)。