3

我想将两个 yaml 文档与包含的结果合并

  • 所有映射值(最后一个优先)
  • 串联数组

例如给定这个文件

# file1.yml
animals:
  - elephant
    donkey
flavours:
  sour:
    - lemon
  sweet:
    - chocolate
strange: true

和这个文件

#file2.yml
animals:
  - monkey
    pelican
flavours:
  sweet:
    - vanilla
strange: false

结果应该包含所有节点,合并数组和不是来自最后一个文件的数组的值

#result.yml
animals:
  - elephant
    donkey
    monkey
    pelican
flavours:
  sour:
    - lemon
  sweet:
    - chocolate
      vanilla
strange: false

yq 可以做到这一点,也许?

4

1 回答 1

8

将 YAML 文件与yq, 连接数组合并。

假设

file1.ymlfile2.yml中,animals数组都包含一个带有多行字符串的索引。

elephant
donkey

对于file1.yml, 和

monkey
pelican

file2.yml.

既然您询问了concatenated array,我假设file1.ymlfile2.yml并且results.yml应该是这样的:

# file1.yml
animals:
  - elephant
  - donkey
flavours:
  sour:
    - lemon
  sweet:
    - chocolate
strange: true

# file2.yml
animals:
  - monkey
  - pelican
flavours:
  sweet:
    - vanilla
strange: false

# result.yml
animals:
  - elephant
  - donkey
  - monkey
  - pelican
flavours:
  sour:
    - lemon
  sweet:
    - chocolate
    - vanilla
strange: false

例子

使用yq4.x,您可以使用ireduce运算符来合并两个或多个文件:

https://mikefarah.gitbook.io/yq/operators/reduce#merge-all-yaml-files-together

$ yq4 eval-all '. as $item ireduce ({}; . * $item)' file1.yml file2.yml
animals:
  - monkey
  - pelican
flavours:
  sour:
    - lemon
  sweet:
    - vanilla
strange: false

两个文件都已合并,但重复的键和数组已被最新文件覆盖。

要附加数组而不是覆盖它们,只需+在合并运算符 ( *) 之后添加一个。

https://mikefarah.gitbook.io/yq/operators/multiply#merge-appending-arrays

$ yq4 eval-all '. as $item ireduce ({}; . *+ $item)' file1.yml file2.yml
animals:
  - elephant
  - donkey
  - monkey
  - pelican
flavours:
  sour:
    - lemon
  sweet:
    - chocolate
    - vanilla
strange: false
于 2021-04-10T16:07:22.650 回答