79135352

Date: 2024-10-28 23:07:22
Score: 0.5
Natty:
Report link

I think I found a way to massage @EdMorton "copy_array" implemntation, into something that "flattens" the true multi-dimensional 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

Not particularly graceful, but... Unless someone else can offer an alternative...

Reasons:
  • Long answer (-1):
  • Has code block (-0.5):
  • User mentioned (1): @EdMorton
  • Self-answer (0.5):
  • Low reputation (0.5):
Posted by: vgersh99