如何用yq合并YAML树组件并按foo/bar拆分多文档?
用yq按foo/bar轴拆分YAML文档
输入YAML结构
root1: foo: prop1: val1 bar: prop1: val2 root2: foo: prop2: val3 bar: prop2: val4
目标输出
root1: foo: prop1: val1 root2: foo: prop2: val3 --- root1: bar: prop1: val2 root2: bar: prop2: val4
实现步骤
1. 构建可拆分的数组
先把每个目标轴(foo、bar)对应的所有root节点数据提取出来,组合成一个数组。用yq的keys方法获取顶级节点(root1、root2),再对每个轴做映射处理:
yq '["foo", "bar"] | map( . as $axis | reduce keys[] as $root ({}; .[$root] = {($axis): $parent[$root][$axis]}))' input.yaml
这段命令的逻辑:
- 先定义要拆分的轴数组
["foo", "bar"] - 遍历数组中的每个轴
$axis,再遍历所有顶级root节点 - 为每个root节点仅保留当前轴对应的子结构,最终组合成完整对象
- 所有轴对应的对象会被收集到一个数组中
执行后得到的数组结构:
- root1: foo: prop1: val1 root2: foo: prop2: val3 - root1: bar: prop1: val2 root2: bar: prop2: val4
2. 拆分为多个文档
基于上述数组,直接用split_doc函数把数组的每个元素拆分成独立的YAML文档:
yq '["foo", "bar"] | map( . as $axis | reduce keys[] as $root ({}; .[$root] = {($axis): $parent[$root][$axis]})) | split_doc' input.yaml
执行后就能得到目标格式的多文档YAML输出。
内容的提问来源于stack exchange,提问作者joel
相关产品推荐
相关产品推荐

