在 Mawk 中行走多维数组

在 Mawk 中行走多维数组

我能够在 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工作的人)真正的多维数组,尽管手册页(恕我直言)有点误导:在介绍if ((i,j) in array)它之后立即跟随“in 构造也可以用在 for 循环中来迭代数组的所有元素。(自 v4.1.1 起已修复!)。

但是,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的列表,或(测试是否存在,无需ijif ((i,j) in A)自动活化的索引)。

如果gawk您不能使用(i,j) in arr其中 arr 是真正的多维数组,则需要将其分成两个(或任意多个维度)for循环,如上所述。不过,为了完全正确,内部循环应该包含一个isarray()条件,因为不需要每个元素arr[i]依次都是数组,gawk 也很乐意允许标量。

据我所知,mawk除了手册页,它的目标是成为一个标准的新awk(即nawk)实现(因此没有真正的多维数组,没有索引排序,也没有isarray())。

相关内容