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).将括号中的整个索引序列(以逗号分隔)写为左操作数:
Run Code Online (Sandbox Code Playgroud)(subscript1, subscript2, ...) in array
不,语法
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)
循环,但你可能需要一些额外的工作来分成a
它x
和它们的y
部分.