awk array subscriptor type

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值