81. 多维数组
awk 只有一维数组。但是,awk 的美妙之处在于您可以使用一维数组本身来模拟多维数组。
假设您要创建以下 2 x 2 多维数组。
10 20
30 40
在上面的示例中,位置 "1,1"
处的 item 为 10,位置 "1,2"
处的 item 为 20,依此类推。执行以下操作将 10 分配给位置 "1,1"
。
item["1,1"]=10
即使您给出了 "1,1"
作为索引,它也不是两个索引。它只是一个带有字符串 "1,1"
的索引。因此,在上面的示例中,您实际上将值 10 存储在索引为 "1,1"
的一维数组中。
$ cat array-multi.awk
BEGIN {
item["1,1"]=10;
item["1,2"]=20;
item["2,1"]=30;
item["2,2"]=40;
for (x in item)
print item[x];
}
$ awk -f array-multi.awk
10
20
30
40
现在,如果不将索引括在引号中会发生什么? 即 item[1,1]
(而不是 item["1,1"]
),如下例所示。
$ cat array-multi2.awk
BEGIN {
item[1,1]=10;
item[1,2]=20;
item[2,1]=30;
item[2,2]=40;
for (x in item)
print item[x];
}
$ awk -f array-multi2.awk
30
40
10
20
上面的示例程序仍然可以工作。但是,有一个区别。在多维 awk 数组中,当未将索引括在引号内时,awk 使用下标分隔符,默认值为 "\034"
。
当您指定 item[1,2]
时,它将被转换为 item["1\0342"]
。awk 将使用中间的 \034
组合两个下标并将它们转换为字符串。
当您指定 item["1,2"]
时,它将不会被翻译,因为它将被视为没有下标的一维数组。
下面的示例对此进行了演示。
$ cat array-multi3.awk
BEGIN {
item["1,1"]=10;
item["1,2"]=20;
item[2,1]=30;
item[2,2]=40;
for (x in item)
print "Index",x,"contains",item[x];
}
$ awk -f array-multi3.awk
Index 1,1 contains 10
Index 1,2 contains 20
Index 2#1 contains 30
Index 2#2 contains 40
在上面的例子中:
- 索引
"1,1"
和"1,2"
用引号引起来。因此,这被视为一维数组索引,awk 不使用下标分隔符。因此,索引按原样打印。 - 索引
2,1
和2,2
不包含在引号中。因此,这被视为多维数组索引,并且 awk 使用下标分隔符。所以,索引是"2\0341"
和"2\0342"
,在下标之间打印不可打印字符"\034"
。