如何用YQ将含双数组属性的简单对象展开为对象数组?
使用yq将含数组属性的YAML对象展开为对象数组
需求说明
现有一个包含两个数组属性的YAML对象,需要将两个数组做笛卡尔积展开,转换为多个对象组成的数组,每个对象包含原对象的非数组属性,以及两个数组各取一个元素的对应属性。
输入YAML示例
name: a spaces: - alpha - beta envs: - dev - test - prod
期望输出
- name: a space: alpha env: dev - name: a space: alpha env: test - name: a space: alpha env: prod - name: a space: beta env: dev - name: a space: beta env: test - name: a space: beta env: prod
解决方案(分yq版本)
1. mikefarah/yq(v4+,主流版本)
使用对象合并操作符*结合数组展开,自动生成笛卡尔积:
yq '{"name": .name} * ({"space": .spaces[]} * {"env": .envs[]})' input.yaml
命令解释:
{"name": .name}:提取原对象的name属性,生成基础对象{"space": .spaces[]}:将spaces数组展开为多个仅含space字段的对象{"env": .envs[]}:将envs数组展开为多个仅含env字段的对象*:合并对象时,若操作数为数组会自动生成所有组合的笛卡尔积,最终输出符合要求的对象数组
2. kislyuk/yq(Python版)
通过显式遍历数组元素生成目标对象:
yq -n 'load("input.yaml") as $doc | $doc.name as $name | $doc.spaces[] as $space | $doc.envs[] as $env | {"name": $name, "space": $space, "env": $env}'
命令解释:
-n:启用空输入模式,手动加载文件load("input.yaml") as $doc:加载输入YAML文档并赋值给变量$doc$doc.spaces[] as $space:遍历spaces数组的每个元素$doc.envs[] as $env:遍历envs数组的每个元素- 最后组合
name、space、env生成每个目标对象,遍历过程会自动生成所有组合
内容的提问来源于stack exchange,提问作者Kees C. Bakker
相关产品推荐
相关产品推荐

