用于多维数组的awk数组迭代

cob*_*obp 19 arrays awk associative-array

Awk为数组处理提供关联索引.可以迭代1维数组的元素:

例如

for(index in arr1)
  print "arr1[" index "]=" arr1[index]
Run Code Online (Sandbox Code Playgroud)

但是这种二维数组怎么做呢?下面给出的那种语法有用吗?

for(index1 in arr2)
for(index2 in arr2)
   arr2[index1,index2]     
Run Code Online (Sandbox Code Playgroud)

Pau*_*ce. 36

AWK通过将索引与SUBSEP变量(0x1c)中保存的字符连接来伪造多维数组.你可以split像这样迭代一个二维数组(基于info gawk文件中的一个例子):

awk 'BEGIN { OFS=","; array[1,2]=3; array[2,3]=5; array[3,4]=8; 
  for (comb in array) {split(comb,sep,SUBSEP);
    print sep[1], sep[2], array[sep[1],sep[2]]}}'
Run Code Online (Sandbox Code Playgroud)

输出:

2,3,5
3,4,8
1,2,3
Run Code Online (Sandbox Code Playgroud)

但是,您可以使用嵌套for循环遍历数字索引的数组:

for (i = 1; i <= width; i++)
    for (j = 1; j < = height; j++)
        print array[i, j]
Run Code Online (Sandbox Code Playgroud)

GAWK手册中另一个值得注意的信息:

要测试多维数组中是否存在特定索引序列,请使用用于单维数组的相同运算符(in).将括号中的整个索引序列(以逗号分隔)写为左操作数:

     (subscript1, subscript2, ...) in array
Run Code Online (Sandbox Code Playgroud)


psm*_*ars 6

不,语法

for(index1 in arr2) for(index2 in arr2) {
    print arr2[index1][index2];
}
Run Code Online (Sandbox Code Playgroud)

不行.Awk并不真正支持多维数组.它做了什么,如果你做了类似的事情

x[1,2] = 5;
Run Code Online (Sandbox Code Playgroud)

是连接两个索引(1和2)来创建一个字符串,由SUBSEP变量的值分隔.如果这等于"*",那么你的效果与之相同

x["1*2"] = 5;
Run Code Online (Sandbox Code Playgroud)

默认值为SUBSEP非打印字符,对应于Ctrl + \.您可以使用以下脚本查看此内容:

BEGIN {
    x[1,2]=5;
    x[2,4]=7;
    for (ix in x) {
        print ix;
    }
}
Run Code Online (Sandbox Code Playgroud)

运行这个给出:

% awk -f scriptfile | cat -v
1^\2
2^\4
Run Code Online (Sandbox Code Playgroud)

所以,回答你的问题 - 如何迭代一个多维数组 - 只需使用一个for(a in b)循环,但你可能需要一些额外的工作来分成ax和它们的y部分.