web-dev-qa-db-ja.com

コマンドラインでawk配列を設定しますか?

-vスイッチを使用してコマンドラインでawkを実行し、変数の値を設定できることを知っています。

コマンドラインでawk連想配列要素の値を設定する方法はありますか?

何かのようなもの:

awk -v myarray[index]=value -v myarray["index two"]="value two" 'BEGIN {...}'
7
Wildcard

いいえ。コマンドラインでこのような非スカラー変数を割り当てることはできません。しかし、それを作るのはそれほど難しいことではありません。

固定配列名を受け入れることができる場合:

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 を確認すると役立つ場合があります。

7
joepd

POSIX awkでは、それを行うことはできません。

割り当て形式-v assignmentは次のように定義されました。

ポータブル文字セットのアルファベット文字(XBDポータブル文字セットの表を参照)で始まり、その後にポータブル文字セットのアンダースコア、数字、アルファベットのシーケンスが続き、その後に「=」文字が続くオペランド。パス名ではなく変数割り当てを指定する必要があります。 '='の前の文字は、awk変数の名前を表します。その名前がawkの予約語(文法を参照)の場合、動作は定義されていません

それはawk変数名前のみを許可します。

awk配列要素を次のように設定すると:

myarray[index]=value

myarray[index]左辺値であり、変数ではありません名前。だからそれは違法です。

任意の変数とフィールドは、次のように設定できます。

lvalue = expression

with lvalueは、変数、インデックス付きの配列、またはフィールドセレクターにすることができます。

2
cuonglm

これはどう?

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形式の日付です。文字列を配列として使用します。これは不正行為ですか?

0
Rick