awk

Multi Dimensional Array

多维数据组

awk仅有一维数组。但是awk的美妙之处在于,你可以使用一维数组本身模拟多维数组。

假如你想创建下面2*2多维数组。

10  20
30  40

在上面的例子里, 项目在位置 "1,1" 是 10, 项目在位置 "1,2" 是 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
30
20
40
10

现在,当你索引上不用引号括起来,会发生什么?

$ 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,2 contains 20
Index 21 contains 30
Index 22 contains 40
Index 1,1 contains 10

在上面的例子里:

* 索引 "1,1" 和 "1,2" 用引号括起来. 所以, 这将被视为一维数组索引, 没有下标分隔符被awk使用. 因此, 索引原样打印.

* 索引 2,1 和 2,2 没有引号. 所以, 这将视为一个多维数组索引, awk使用一个下标分隔符. 所以, 索引是 "2\0341" 和 "2\0342", 输出在下标之间使用非打印字符串"\034".