文字列で配列要素を参照し、awkで配列を初期化する


8
#!/usr/bin/env bash
awk '
  BEGIN {
    arr[A]=1;
    arr[B]=1;
    arr[C]=1;
    arr[E]=1;
    arr[J]=8;
    arr[Q]=10;
    print arr[J]
  }'

上記のコマンドは、の最新の設定値を出力します。arr['subscript']この場合10は、arr[Q]直前の値であり、の値ではprintありません。8arr[J]

また、上記のスクリプトのように、一度に1行ずつarr['A'], arr['B'], arr['C'] and arr['E']同じ値を持つ値に値を割り当てたくはありません1。代わりに、パラメータの1つとして添え字の配列を渡し、他のパラメータとして共通の値を渡します。それらに値を割り当てるロジック。

回答:


16

配列インデックスは、整数または引用符付きの文字列ですawk。ここでは、まだ初期化されていない変数を使用しています。したがって、それらの値は空です。

各割り当てが前の値を上書きしているため、配列に割り当てられた最新の値を取得します。を使用print arr[""]することもあなたに恩恵をもたらすでしょう10

代わりに、のように文字列を使用しますarr["A"]=1

最後の問題について:awkコマンドラインから配列を初期化するための実際の機能はありませんが、BEGINブロック内で「デコード」する「エンコードされた」値を渡して、配列のキーと値を抽出できます。

特別に区切られたリストを単一の文字列として渡し、それを解析して使用するインデックスと値を抽出する例:

awk -v vals="A=1:B=1:C=1:E=1:J=8:Q=10" '
    BEGIN {
        n = split(vals, v, ":")
        for (i = 1; i <= n; ++i) {
            split(v[i], a, "=")
            arr[a[1]] = a[2]
        }

        print arr["J"]
    }'

個別のキーと値を使用する:

awk -v keys="A:B:C:E:J:Q" -v vals="1:1:1:1:8:10" '
    BEGIN {
        nk = split(keys, k, ":")
        nv = split(vals, v, ":")

        if (nk != nv) exit 1

        for (i = 1; i <= nk; ++i)
            arr[k[i]] = v[i]

        print arr["J"]
    }'

これは「配列」をに渡すのにかなり限定された方法ですawkが、完全に制御できる単純な値に対しては機能します。これらの例は、実際のデータにコロン(および最初の例の場合は等号)を埋め込んでいるデータでは機能しません。

このようなデータを渡すことは、データ内のバックスラッシュを特別に処理する必要があることも意味します(\n改行になるため、2文字の文字列を渡すには、または\nを使用する必要があります)。"\\\n"'\\n'

関連もあります:


余談ですが、次のawkような「純粋なスクリプト」を書くことができます。

#!/usr/bin/awk -f

BEGIN { 
   # some initialisations
}

some_expression { some code }

END {
    # more here
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.