如何将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
相关产品推荐
相关产品推荐

