转换awk数组下标的规则是什么?

时间:2015-04-13 08:06:16

标签: linux unix awk gawk

我知道,awk数组的下标必须是一个字符串。

[root@localhost]# awk 'END {array[A0]="empty"; print array[""]}'
empty

因此,在上面的命令行中,由于A0未引用为"A0",因此它代表变量。由于变量A0之前未设置值,因此值为""。因此print array[""]输出empty

但是在以下命令中:

[root@localhost]#  awk 'END {array[0]="empty"; print array[""], array["0"]}'
 empty

array[""]的值为NULL,而array["0"]"empty"。根据我的理解,因为变量不能以数字开头,所以array[0]默认会转换为array["0"]。这样对吗?转换awk数组下标的规则是什么?

1 个答案:

答案 0 :(得分:4)

awk中的数组下标是字符串,因此当您将表达式用作数组下标时,它将转换为字符串(如果它不是一个字符串)。 0是一个数字,而不是变量,因此以下内容适用(来自POSIX):

  

一个完全等于整数值的数值(参见ISO C标准派生的概念)应转换为字符串,相当于调用 sprintf 函数(请参阅字符串函数),并将字符串"%d"作为 fmt 参数,并将数值转换为第一个且唯一的 expr 参数。任何其他数值都应转换为字符串,相当于调用 sprintf 函数,变量 CONVFMT 的值为 fmt 参数和数值被转换为第一个也是唯一的 expr 参数。如果 CONVFMT 的值不是浮点格式规范,则未指定转换结果。

0是一个整数,因此在转换为字符串时会提供"0",而不是""。这是因为在C代码中,在sprintf(buf, "%d", 0)之后,buf将包含字符串"0"

对于变量名称:在awk grammar中,变量由标记 NAME 描述。它的词典规范如下:

  

9)应考虑便携式字符集中的下划线,数字和字母序列(参见IEEE Std 1003.1-2001的基本定义卷,第6.1节,便携式字符集),以下划线或字母开头一句话。

     

12)令牌 NAME 应包含一个不是关键字或内置函数名称的单词,并且不会立即跟随(没有任何分隔符)。 ('字符。

遵循此描述的标记是变量,最初为空,当空变量转换为字符串时,它会产生空字符串。

即便:

  • 0是一个数字
  • a是变量名称
  • _是变量名称
  • a0是变量名称
  • _0是变量名称
  • 0a被解析为0 a0和变量a的串联)