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

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

-vこのスイッチをコマンドラインで使用してawk変数値を設定できることがわかります。

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

それは次のとおりです。

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

答え1

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

固定配列名が利用可能な場合:

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]}'

本当にしたい場合は、runの代わりにgawk使用できます。これにより、解釈されていないコマンドラインが提供されます。その後、これらのコマンドラインオプションを処理できます(変数の割り当てのように見える場合は、変数を割り当ててください)。そのルートに行きたい場合は、次のことを確認すると役に立ちます。-E-fngetopt.awk

答え2

POSIXではawkそうすることはできません。

これ仕事正式に-v assignmentは次のように定義されます。

移植可能な文字セットまたはアルファベット文字(XBD移植可能な文字セットの表を参照)で始まり、移植可能な文字セットの一連の下線、数字、および文字、最後に「=」文字、変数の割り当てが続きます。パス名の代わりに指定する必要があります。 "="の前の文字はawk変数の名前を表します。名前がawk予約語(構文を参照)の場合、動作は定義されていません。

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

awk配列要素を設定する場合:

myarray[index]=value

myarray[index]はいlvalue、不変名前。だから違法です。

すべての変数とフィールドを設定できます。

lvalue = expression

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

答え3

これはどうですか?

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

関連情報