配列インデックスは、整数または引用符付きの文字列です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
}