awk中的二维数组处理

时间:2013-04-17 04:46:14

标签: awk syntax-error gawk

我正在尝试一个简单的二维数组awk脚本,如下所示:

BEGIN{
     b[1][1]=0
     split("5 4 3 2",b[1])
     print b[1][1]
}

此代码片段在gnu gawk教程中也有提及。但是当我试图运行它时,我得到了b的索引的语法错误。谁能说出问题是什么?在gnu教程中,他们已经显示了输出。

1 个答案:

答案 0 :(得分:7)

<强>已更新

普通awk使用b[1,1]语法,但它不是真正的2D数组。而是哈希,具有1 SUBSEP 1之类的元素。因此,如果您使用for (i in b) print i,那么您将拥有此类指数。 <{1}}的默认值为0x34,但可以重新定义。

SUBSEP无法定义数组元素。但是你可以移动到一个普通变量并用for循环填充split。我们试试吧:

b

说:“awk:./ x.awk:5:致命:分裂:第二个参数不是数组”

接下来尝试:

BEGIN{
     #b[1,1] is automatically created if referenced, even by a read.
     split("5 4 3 2",b[1]);
     print b[1,1];
}

不。错误:“awk:./ x.awk:5:致命:尝试在标量上下文中使用数组'a'”

您可以使用什么来将分割结果存储在一个数组中,然后将其复制到2D中,如同以下结构:

BEGIN{
     split("5 4 3 2",a);
     b[1] = a;
     print b[1,1];
}

请注意BEGIN{ split("5 4 3 2",a); for(i in a) b[1,i]=a[i]; print b[1,1]; } 不是真正的2D数组。现在它有4个这样的元素:bb[1 SUBSEP 1] == 5&amp; c。

如果您想转储be的值,您可以创建两个循环或只创建一个循环,例如:

b[1 SUBSEP 2] == 4

输出:

for (i in b) print i" => "b[i];

如果您想查看分隔符,请将其设置为可见的内容:

11 => 5
12 => 4
13 => 3
14 => 2

输出:

BEGIN{
     SUBSEP=":"
     split("5 4 3 2",a);
     for(i in a) b[1,i]=a[i];
     print b[1,1];
     print b[1 SUBSEP 1];
     for (i in a) print "a-"i" => "a[i];
     for (i in b) print "b-"i" => "b[i];
}

如您所见,哈希元素不按数字顺序打印。我很惊讶5 5 a-4 => 2 a-1 => 5 a-2 => 4 a-3 => 3 b-1:1 => 5 b-1:2 => 4 b-1:3 => 3 b-1:4 => 2 以这种方式打印。但你不能相信这一点(见b元素)。

<强> ADDED

我使用 3.1.5进行了检查,ab[1][1]符号不起作用(正如预期的那样)。我也尝试了 4.1.0,两者都有效!似乎在较新的中,split("5 4 3 2",b[1])b[1][1]=0中定义了一个数组,因此b[1]可以正常工作。但split("5 4 3 2",b[1])表现不同。它的行为方式很旧,因此b[1,1]=0不是真正的数组(因为没有这样的元素,而是b[1])。

因此,请尝试b[1 SUBSEP 1]检查版本并使用旧语法,因为您的对于新语法而言似乎太旧了。