awk中的二维数组处理
我正在尝试一个简单的二维数组awk脚本,如下所示:
BEGIN{ b[1][1]=0 split("5 4 3 2",b[1]) print b[1][1] } 这段代码片段也在gnu gawk教程中提到过.但是当我试图运行它时,我得到了b的索引的语法错误.谁能说出问题是什么?在gnu教程中,他们已经显示了输出. 解决方法
更新
普通awk使用b [1,1]语法,但它不是真正的2D数组.而是一个散列,具有像1 SUBSEP 1这样的元素.因此,如果您使用(i in b)print i,那么您将拥有这样的索引. SUBSEP的默认值是0x34,但可以重新定义. split不能定义数组元素.但是您可以移动到正常变量并使用for循环填充b.我们试试吧: 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:致命:分裂:第二个参数不是数组” 接下来尝试: BEGIN{ split("5 4 3 2",a); b[1] = a; print b[1,1]; } 不.错误:“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]; } 请注意,b不是真正的2D数组.现在它有4个这样的元素:b [1 SUBSEP 1] == 5,b [1 SUBSEP 2] == 4& c. 如果你想转储be的值,你可以创建两个循环或只创建一个循环,如: for (i in b) print i" => "b[i]; 输出: 11 => 5 12 => 4 13 => 3 14 => 2 如果要查看分隔符,请将其设置为可见的内容: BEGIN{ SUBSEP=":" split("5 4 3 2",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那样打印.但你不能相信这一点(见元素). 添加 我检查了gawk 3.1.5并且b [1] [1]和split(“5 4 3 2”,b [1])表示法不起作用(如预期的那样).我也试过gawk 4.1.0,两者都在工作!似乎在较新的gawk中,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来检查版本并使用旧语法,因为看起来您的awk对于新语法来说太旧了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |