• 本页内容

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,12,2 不包含在引号中。因此,这被视为多维数组索引,并且 awk 使用下标分隔符。所以,索引是 "2\0341""2\0342",在下标之间打印不可打印字符 "\034"