在命令行上设置 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]}'

如果您确实愿意,可以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。使用字符串作为数组。这是作弊吗?

相关内容