linux中二维数组,awk中的二维数组处理

本文探讨了使用awk处理二维数组时遇到的问题,并提供了详细的解决方案。包括如何正确使用split函数填充数组,以及如何通过循环实现类似二维数组的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我正在尝试一个简单的二维数组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",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那样打印.但你不能相信这一点(见元素).

添加

我检查了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对于新语法来说太旧了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值