You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将gawk 4.x+真多维数组转换为旧版模拟数组?

Gawk 真多维数组扁平化实现方案

要实现任意深度的真多维数组到旧版模拟数组的转换,核心是利用gawk 4.1+提供的walk_array内置函数递归遍历数组,收集路径索引并拼接成扁平键。以下是完整实现:

实现代码

function flatten_array(src_arr, dest_arr,    indices, i) {
    function walk_cb(elem, idx, arr, depth) {
        if (typeof(elem) == "array") {
            indices[depth] = idx
            walk_array(elem, walk_cb, depth + 1)
            delete indices[depth]
        } else {
            var key = ""
            for (i = 1; i < depth; i++) {
                key = key (key == "" ? "" : ", ") indices[i]
            }
            key = key (key == "" ? "" : ", ") idx
            dest_arr[key] = elem
        }
    }

    delete indices
    walk_array(src_arr, walk_cb, 1)
}

# 测试示例
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"]["z"] = 99  # 3层深度测试用例

    flatten_array(arr, arrFlat)

    # 格式化输出扁平化结果
    for (key in arrFlat) {
        printf "arrFlat[\"%s\"] = %s\n", gensub(/, /, "\", \"", "g", key), arrFlat[key]
    }
}

关键逻辑说明

  • 递归遍历:通过walk_array遍历原数组的每个元素,回调函数walk_cb区分当前元素是数组还是普通值
  • 索引收集与回溯:用indices数组记录当前遍历路径的索引,进入子数组时保存索引,遍历完成后删除该索引实现回溯
  • 扁平键拼接:遇到普通值时,将路径上的所有索引用, 拼接,作为扁平化数组的键
  • 任意深度支持:递归逻辑不限制数组的深度,无论多少层嵌套都能正确转换

使用方法

将代码保存为flatten.awk,执行以下命令运行:

gawk -f flatten.awk

运行后会输出符合要求的扁平化数组结果,包括测试用的3层嵌套元素。

内容的提问来源于stack exchange,提问作者vgersh99

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 16:40:00