Search code examples
bashyamlyq

YQ: explode simple YAML object into array of objects


I'm using Bash and YQ to do some YAML parsing. My input is a simple object that contains two array properties. I would like to explode both arrays so my simple object is converted into an array of objects.

Consider the following YAML:

name: a
spaces:
  - alpha
  - beta
envs:
  - dev
  - test
  - prod

Now I would like to "explode" both arrays so I get multiple objects:

- 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

How can I do this with YQ?


Solution

  • Just iterate over the arrays using [], create your final objects using {…}, and wrap everthing in array brackets […] again:

    yq '[{"name": .name, "space": .spaces[], "env": .envs[]}]' file.yaml
    
    - 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