web-dev-qa-db-ja.com

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は、多次元配列がどのように機能するかについて異なる考えを持っているようです。 mawkを使用してDebianで実行すると、構文エラーが発生します。 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ステートメントを使用して最初の次元を選択できるように(非常に非効率的で恐ろしい)、WHOLE配列をウォークしようとしています...しかし、それもできません!:

$ 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のマンページ以外の言語リファレンスはありますか?

ありがとう!

3
mgjk

mawk(およびnawk)は、合成された多次元配列のみを提供します。

gawkは(4.0以降、thxmanatwork)真の多次元配列を提供します。 マニュアルページ(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])
}
_

さて、次の問題はorderingであり、配列インデックスは暗黙的に文字列型であり、配列は暗黙的に順序付けされていません。 0..Nからの連続する整数インデックスを持つ単純な非スパース配列の場合のように、インデックスに関する個別の知識がない限り。 gawk注文されたinのソリューション を提供します。

合成された配列のインデックスがわかっている場合は、_A[i,j]_(_A[i SUBSEP j]_として扱われます)、またはfor/inといくつかの文字列分割を使用できます。 ij、またはif ((i,j) in A)のリストを再構築します(インデックスのautovivificationなしで存在をテストします)。

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

manページ 以外のmawk固有のドキュメントは知らないので、標準の新しいawk(つまり、nawk)の実装を目指しています(つまり、真の多次元配列、インデックスの並べ替え、およびisarray())はありません。

5
mr.spuratic