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] は正しい構文のようで、多次元配列を「合成」します。

そこで私は 2 つのことを試しましたが、どちらも機能しませんでした。

$ 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 [

理にかなっているように思えますが、「多次元」配列で 1 次元配列インデックスを使用するとエラーが発生します。

配列全体を走査して、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以降、ありがとう管理作業) は真の多次元配列ですが、マニュアルページ (IMHO) では少し誤解を招く表現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といくつかの文字列分割を使用して のリストと を再構築するかijまたはif ((i,j) in A)( の存在をテストし、自動活性化インデックスの)。

では、arr が真の多次元配列である場合はgawk使用できません。上記のように、2 つの (または任意の数の次元) ループに分割する必要があります。ただし、完全に正しくするには、内側のループに条件を含める必要があります。 のすべての要素が配列である必要はなく、gawk はスカラーも許可します。(i,j) in arrforisarray()arr[i]

mawk他に具体的な文書は知らないマニュアルページ、これは標準的な新しいawk(つまりnawk) 実装を目指しています (したがって、真の多次元配列、インデックスソート、 はありませんisarray())。

関連情報