我有 gawk (4.++) 真正的多维数组,我想“展平”(转换为旧/模拟 - gawk 4.x 之前的)数组。
arr["a"]["a"] = 21
arr["a"]["b"] = 21
arr["b"]["a"] = 2
arr["b"]["b"] = 3
arr["c"]["a"] = 4
转换为
arrFlat["a", "a"] = 21
arrFlat["a", "b"] = 21
arrFlat["b", "a"] = 2
arrFlat["b", "b"] = 3
arrFlat["c", "a"] = 4
我一直在研究处理多维数组的多个线程,包括this
以及其他处理 walk_array 等的人。 我确信这个问题之前已经被问过,但我无法找出将一个数组表示转换为另一个数组表示的正确递归调用。我需要这个来简化多维数组的“按值排序”(数字或其他)。
显然数组(源arr)的索引“深度”不限于示例中的2。
任何人都可以分享任何金块!
我想我找到了一种方法来按摩@EdMorton“copy_array”实现,将其“压平”真正的多维数组:
$ cat flatten.awk
BEGIN {
arr["a"]["a"] = 21
arr["a"]["b"] = 21
arr["b"]["a"] = 2
arr["b"]["b"] = 3
arr["c"]["a"] = 4
arr["d"]["x"]["y"]= 90
arr["d"]["x"]["z"]= 95
walk_array(arr, "arr")
PROCINFO["sorted_in"]="@val_num_asc"
flatten_array(arr, flatten, "")
print "----------"
walk_array(flatten, "flatten")
}
function flatten_array(orig, flatten, idx, i)
{
for (i in orig) {
if (isarray(orig[i])) {
flatten_array(orig[i], flatten, (length(idx) ? (idx SUBSEP i) : i) )
}
else {
#printf("idx->[%s]\n", idx) > "/dev/stderr"
flatten[idx SUBSEP i] = orig[i]
}
}
}
function walk_array(arr, name, i)
{
for (i in arr) {
if (isarray(arr[i]))
walk_array(arr[i], (name "[" i "]"))
else
printf("%s[%s] = %s\n", name, i, arr[i])
}
}
$ gawk -f flatten.awk
arr[a][a] = 21
arr[a][b] = 21
arr[b][a] = 2
arr[b][b] = 3
arr[c][a] = 4
arr[d][x][y] = 90
arr[d][x][z] = 95
----------
flatten[ba] = 2
flatten[bb] = 3
flatten[ca] = 4
flatten[aa] = 21
flatten[ab] = 21
flatten[dxy] = 90
flatten[dxz] = 95
不是特别优雅,但是... 除非其他人可以提供替代方案...