-v
スイッチを使用してコマンドラインでawk
を実行し、変数の値を設定できることを知っています。
コマンドラインでawk
連想配列要素の値を設定する方法はありますか?
何かのようなもの:
awk -v myarray[index]=value -v myarray["index two"]="value two" 'BEGIN {...}'
いいえ。コマンドラインでこのような非スカラー変数を割り当てることはできません。しかし、それを作るのはそれほど難しいことではありません。
固定配列名を受け入れることができる場合:
awk -F= '
FNR==NR { a[$1]=$2; next}
{ print a[$1] }
' <(echo $'index=value\nindex two=value two') <(echo index two)
配列定義のawk構文を含むファイルがある場合は、次のようにinclude
できます。
$ cat <<EOF >file.awk
ar["index"] = "value"
ar["index two"] = "value two"
EOF
$ gawk '@include "file.awk"; BEGIN{for (i in ar)print i, ar[i]}'
または
$ gawk --include file.awk 'BEGIN{for (i in ar)print i, ar[i]}'
本当に必要な場合は、-E
ではなく-f
を指定してgawk
を実行できます。これにより、コマンドラインが解釈されなくなります。次に、これらのコマンドラインオプションを処理できます(変数の割り当てのように見える場合は、変数を割り当てます)。そのルートに行きたい場合は、 ngetopt.awk を確認すると役立つ場合があります。
POSIX awk
では、それを行うことはできません。
割り当て形式-v assignment
は次のように定義されました。
ポータブル文字セットのアルファベット文字(XBDポータブル文字セットの表を参照)で始まり、その後にポータブル文字セットのアンダースコア、数字、アルファベットのシーケンスが続き、その後に「=」文字が続くオペランド。パス名ではなく変数割り当てを指定する必要があります。 '='の前の文字は、awk変数の名前を表します。その名前がawkの予約語(文法を参照)の場合、動作は定義されていません
それはawk
変数名前のみを許可します。
awk
配列要素を次のように設定すると:
myarray[index]=value
myarray[index]
は左辺値であり、変数ではありません名前。だからそれは違法です。
任意の変数とフィールドは、次のように設定できます。
lvalue = expression
with lvalueは、変数、インデックス付きの配列、またはフィールドセレクターにすることができます。
これはどう?
awk _F";" -v M=JanFebMarAprMayJunJulAugSepOctNovDec '$1>=180525 && $1<=180630\
{ m=substr($1,3,2); m=(m-1)*3+1; printf(" %s %d, 20%d\t%s\n",substr(M,m,3),\
substr($1,5,2),substr($1,1,2),$0);}' Filename
「;」で区切られたファイル。最初のフィールドは、yymmdd形式の日付です。文字列を配列として使用します。これは不正行為ですか?