31

AWK でこのような配列を初期化することは可能ですか?

Colors[1] = ("Red", "Green", "Blue")
Colors[2] = ("Yellow", "Cyan", "Purple")

次に、Colors[2,3]="Purple" の 2 次元配列を作成します。


別のスレッドから、それが不可能であることを理解しています(「悲しいことに、split()を悪用せずに一度に配列を設定する方法はありません」)。とにかく、私は 100% 確信したいと思います。同じ質問を持つ他の人がいると確信しています。

上記のような配列を初期化するための最も簡単な方法を探しています。うまく書かれているといいでしょう。

4

5 に答える 5

17

がある場合はGNU awk真の多次元配列を使用できます。この回答はsplit()関数を使用していますが、間違いなくそれを悪用していません。次のように実行します:

awk -f script.awk

内容script.awk

BEGIN {

    x=SUBSEP

    a="Red" x "Green" x "Blue"
    b="Yellow" x "Cyan" x "Purple"

    Colors[1][0] = ""
    Colors[2][0] = ""

    split(a, Colors[1], x)
    split(b, Colors[2], x)

    print Colors[2][3]
}

結果:

Purple
于 2012-12-28T04:41:34.667 に答える
13

2 次元配列を簡単に作成できます。あなたができないこと、AFAIKは、1回の操作で初期化することです。dmckeeがコメントで示唆しているように、配列を初期化できない理由の 1 つは、添え字の型に制限がないため、純粋な数値である必要がないことです。以下のスクリプトのように、複数の割り当てを行うことができます。下付き文字は、変数 SUBSEP で指定された不明瞭な文字で正式に区切られます。デフォルト値は 034 (U+001C、FILE SEPARATOR) です。明らかに、インデックスの 1 つにこの文字が含まれていると、混乱が生じます (しかし、文字列でその文字を最後に使用したのはいつですか?)。

BEGIN {
    Colours[1,1] = "Red"
    Colours[1,2] = "Green"
    Colours[1,3] = "Blue"
    Colours[2,1] = "Yellow"
    Colours[2,2] = "Cyan"
    Colours[2,3] = "Purple"
}
END {
    for (i = 1; i <= 2; i++)
        for (j = 1; j <= 3; j++)
            printf "Colours[%d,%d] = %s\n", i, j, Colours[i,j];
}

実行例:

$ awk -f so14063783.awk /dev/null
Colours[1,1] = Red
Colours[1,2] = Green
Colours[1,3] = Blue
Colours[2,1] = Yellow
Colours[2,2] = Cyan
Colours[2,3] = Purple
$
于 2012-12-28T03:12:02.360 に答える
12

答えてくれてありがとう。とにかく、一次元配列を初期化したい人のために、以下に例を示します:

SColors = "Red_Green_Blue"
split(SColors, Colors, "_")
print Colors[1] " - " Colors[2] " - " Colors[3]
于 2012-12-28T03:36:58.183 に答える