多维数据组
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".