awk中的二维数组处理

use*_*754 3 awk syntax-error gawk

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

BEGIN{
     b[1][1]=0
     split("5 4 3 2",b[1])
     print b[1][1]
}
Run Code Online (Sandbox Code Playgroud)

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

Tru*_*ueY 7

更新

Normal awk使用b[1,1]语法,但它不是真正的2D数组.而是一个哈希,有像这样的元素1 SUBSEP 1.所以,如果你使用for (i in b) print i那么你会有这样的指数.默认值为SUBSEP0x34,但可以重新定义.

split无法定义数组元素.但是您可以移动到正常变量并填充bfor循环.我们试试吧:

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

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

接下来尝试:

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

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

您可以使用什么来将分割结果存储在一个数组中,然后将其复制到2D类似于stuct:

BEGIN{
     split("5 4 3 2",a);
     for(i in a) b[1,i]=a[i];
     print b[1,1];
}
Run Code Online (Sandbox Code Playgroud)

请注意,这b不是真正的2D数组.现在它有4个这样的元素:b[1 SUBSEP 1] == 5,b[1 SUBSEP 2] == 4&c.

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

for (i in b) print i" => "b[i];
Run Code Online (Sandbox Code Playgroud)

输出:

11 => 5
12 => 4
13 => 3
14 => 2
Run Code Online (Sandbox Code Playgroud)

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

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];
}
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

如您所见,哈希元素不按数字顺序打印.我很惊讶那样b打印.但你不能相信这一点(见a元素).

添加

我检查 3.1.5与b[1][1]split("5 4 3 2",b[1])符号不工作(如预期).我也试过 4.1.0,两者都在工作!似乎在更新的b[1][1]=0定义了一个数组,b[1]因此split("5 4 3 2",b[1])可以工作.但b[1,1]=0行为不同.它表现在旧的方式,所以b[1]不是一个真正的数组(因为没有这样的元素,而是b[1 SUBSEP 1]).

因此awk --version,请尝试检查版本并使用旧语法,因为看起来您的对于新语法而言太旧了.