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 [

「多次元」配列に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基準、ありがとう。従業員)マニュアルページ(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合計リストを再構築する(存在するかどうかをテストする必要はありません)ijif ((i,j) in A)自動起動インデックス)。

gawkarrが真の多次元配列であるループを使用できない場合は、上記のように(i,j) in arrこれを2つ(または必要な数の次元)ループに分割する必要があります。forただし、完全に正確にするには、内部ループに条件文を含める必要があります。なぜなら、すべての要素が順番に配列であるisarray()必要はなく、gawkでは喜んでスカラーも受け入れるからです。arr[i]

私が知っているmawk限り、マニュアルページ、これは標準の新しいawk(ish)実装を目指しています(したがって、実際の多次元配列もなく、インデックスソートもありません)。nawkisarray()

関連情報