【问题标题】:jq: extract a specific key from one object to anotherjq:从一个对象中提取特定键到另一个对象
【发布时间】:2019-06-06 23:06:40
【问题描述】:

我有两个 JSON 文件。

file1.json:

{
  "Fruits": [
  {
    "name": "Apple",
    "something_else": 123,
    "id": 652090
  },
  {
    "name": "Orange",
    "something_else": 456,
    "id": 28748
  }
]}

file2.json:

{
  "Fruits": [
  {
    "weight": 5,
    "id": 652090
  },
  {
    "weight": 7,
    "id": 28748
  }
]}

如果两个文件中的对象有一个公用键“id”,我想组合它们,但只从 file1 中提取“name”属性。我如何使用 jq 做到这一点?

这是我想要的:

{
  "Fruits": [
  {
    "name": "Apple",
    "weight": 5,
    "id": 652090
  },
  {
    "name": "Orange",
    "weight": 7,
    "id": 28748
  },
]}

【问题讨论】:

    标签: json jq


    【解决方案1】:

    组合 Fruits 数组,按 id 分组,选择包含 2 个元素的组,因为我们希望 fruits 出现在两个文件中。对于每个选定的组;将first组元素中的name字段添加到second,并将结果收集到一个数组中。

    jq -n '[inputs.Fruits[]]
    | reduce (group_by(.id)[] | select(length==2)) as $f
      ([]; . + [$f[1] + ($f[0] | {name})])' file1.json file2.json
    

    注意命令行中给出的顺序文件很重要,names的文件要在其他之前给出。


    将具有相同 id 的对象组合起来并提取字段子集要容易得多:

    jq -n '[inputs.Fruits[]]
    | group_by(.id)
    | map(select(length==2) | add | {name, id, weight})
    ' file1.json file2.json
    

    【讨论】:

      【解决方案2】:

      有很多方法可以构建它。这是另一种方式:

      $ jq '.Fruits |= (. + input.Fruits | [group_by(.id)[] | add | {name,weight,id}])' \
      file1.json file2.json
      {
        "Fruits": [
          {
            "name": "Orange",
            "weight": 7,
            "id": 28748
          },
          {
            "name": "Apple",
            "weight": 5,
            "id": 652090
          }
        ]
      }
      

      【讨论】:

        猜你喜欢
        • 2022-01-22
        • 2020-11-30
        • 2023-01-28
        • 1970-01-01
        • 2023-03-13
        • 2021-12-21
        • 2018-09-22
        • 1970-01-01
        • 2022-11-19
        相关资源
        最近更新 更多