通过将多个 json 文件合并为一个公共对象来将多个 json 文件合并为一个

通过将多个 json 文件合并为一个公共对象来将多个 json 文件合并为一个

我有很多这样格式的json文件:

样本file1

{
  "attributes": [
    {
      "name": "Node",
      "value": "test"
    }
  ]
}

样本file2

{
  "attributes": [
    {
      "name": "version",
      "value": "11.1"
    }
  ]
}

ETC。

我需要将它们全部合并到一个 json 文件中,例如。

{
  "attributes": [
    {
      "name": "Node",
      "value": "test"
    },
    {
      "name": "version",
      "value": "11.1"
    }
  ]
}

有人可以提供 jq 的解决方案吗?

答案1

jq解决方案:

jq -s '{ attributes: map(.attributes[0]) }' file*.json
  • -s( --slurp) - 而不是为每个运行过滤器JSON输入中的对象,将整个输入流读入一个大数组并仅运行一次过滤器。

示例输出:

{
  "attributes": [
    {
      "name": "Node",
      "value": "test"
    },
    {
      "name": "version",
      "value": "11.1"
    }
  ]
}

答案2

相比之下RomanPerekrest 的解决方案,这将允许您合并目标字段而无需重新创建整个对象:

jq -s '.[0].attributes = [.[].attributes | add] | .[0]' file*.json

这将返回第一个 json 文件的整体,并将.attributes所有其他文件连接在一起。

答案3

jq一种变体,不涉及 slurp,但包含inputsandreduce

jq -n 'reduce inputs as $in ({}; reduce ($in|keys_unsorted)[] as $k (.;
         .[$k] += $in[$k]))'  file1 file2 

答案4

使用yq(来自https://kislyuk.github.io/yq/),然后使用tomlq(来自同一yq发行版)从 TOML 返回到 JSON:

$ yq -t '.' file1 file2 | tomlq .
{
  "attributes": [
    {
      "name": "Node",
      "value": "test"
    },
    {
      "name": "version",
      "value": "11.1"
    }
  ]
}

这是有效的,因为yq -t创建了两个 TOML 文档的串联

[[attributes]]
name = "Node"
value = "test"

[[attributes]]
name = "version"
value = "11.1"

一起,按照规则TOML,这恰好相当于您要创建的 JSON 文档(由于attributes是数组)。因此,当tomlq将其转换回 JSON 时,它会做正确的事情。


您可以使用该实用程序进行等效转换yj(来自https://github.com/sclevine/yj) 也:

yj -tj < <( cat <( yj -jt <file1 ) <( yj -jt <file2 ) )

或者,没有过程替换和cat,

{ yj -jt <file1; yj -jt <file2; } | yj -tj

事实证明,您也可以通过 Hashicorp 的 HCL 格式进行相同类型的往返,分别使用yj -jcyj -cj代替yj -jtyj -tj

相关内容