awk的array是关联数组,由于awk允许string和numeric相互操作,所以需要小心当使用numeric和string作为array下标时的区别。
awk的array的下标都是string类型,对于Non-string类型的下标,将首先将Non-string转换成string,在进行索引。
awk有一个内建变量CONVFMT用于完成numeric到string的转换,我们可以改变CONVFMT来改变转换的结果,当然对于integer,CONVFMT不影响转换结果。默认的CONVMT为"%.6g"。
awk 'BEGIN { print CONVFMT }'
输出将是"%.6g"
对于使用integer和其对应的string作为索引,我们将得到同一个value
BEGIN { # integer index a[0] = 1 # string index a["0"] = 2 print a[0] # 2 print a["0"] # 2 }
这里0将被转换成"0",所以最后我们只得到一个2,1已经被覆盖了。GUN awk manual中有个例子,说明了array下标的问题。
xyz = 12.153 data[xyz] = 1 CONVFMT = "%2.2f" if (xyz in data) printf "%s is in data/n", xyz else printf "%s is not in data/n", xyz
这里将输出12.153 is not in data,原因就是xyz在作为数组下标前,根据CONVFMT进行了转换,而我们在对data[xyz]赋值时,
使用的是"%.6g",于是xyz转换为"12.153",而在 if 判断中,我们已经改变了CONVFMT,此时xyz为"12.15",所以被认为不在data中。
reference:
[1] 7.7 Using Numbers to Subscript Arrays