如何将真正的多维数组“展平”为旧的“模拟”gawk 数组?

问题描述 投票:0回答:1

我有 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。

任何人都可以分享任何金块!

arrays multidimensional-array awk flatten
1个回答
0
投票

我想我找到了一种方法来按摩@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

不是特别优雅,但是... 除非其他人可以提供替代方案...

© www.soinside.com 2019 - 2024. All rights reserved.