我知道-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]}'
如果您确实愿意,可以gawk
使用-E
而不是运行-f
,这会给您带来未解释的命令行。然后,您可以处理这些命令行选项(如果它看起来像变量赋值,则分配该变量)。如果您想走那条路,看看可能会有所帮助ngetopt.awk。
答案2
使用 POSIX awk
,你做不到。
这任务形式上-v assignment
定义为:
以可移植字符集中的 或 字母字符开头(请参阅 XBD 可移植字符集中的表),后跟可移植字符集中的一系列下划线、数字和字母,最后是“=”字符,应指定变量赋值而不是路径名。 “=”之前的字符代表 awk 变量的名称;如果该名称是 awk 保留字(请参阅语法),则行为未定义
那只允许awk
变量姓名。
当您设置awk
数组元素时:
myarray[index]=value
myarray[index]
是左值,不可变姓名。所以这是非法的。
任何变量和字段都可以设置:
lvalue = expression
和左值可以是变量、带有索引的数组或字段选择器。
答案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。使用字符串作为数组。这是作弊吗?