文字列を介して配列要素を参照し、awkで配列を初期化します。

文字列を介して配列要素を参照し、awkで配列を初期化します。
#!/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]print8arr[J]

arr['A'], arr['B'], arr['C'] and arr['E']また、上記のスクリプトのように同じ値を持つ値に 1 行ずつ値を割り当てるのではなく、代わりに添字セットを引数の 1 つに渡し、1共通値を別の値に渡したいと思います。関数を処理する関数の引数は、値を割り当てるロジックです。

答え1

配列インデックスは整数または引用符付き文字列です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つの文字列を渡すにはorを\n使用する必要があります)。"\\\n"'\\n'

関連情報:


ところで、次のように「純粋なスクリプト」を作成できますawk

#!/usr/bin/awk -f

BEGIN { 
   # some initialisations
}

some_expression { some code }

END {
    # more here
}

関連情報