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