首页 > 解决方案 > jq在数组中查找后合并对象

问题描述

生成的配置文件(来自 ls)导致

[
  {
    "file": "PDF/College Louise Michèle 402.pdf",
    "rotation": "-90",
    "fiducial": false
  }
]
[
  {
    "file": "PDF/College PLUM 4 A.pdf",
    "rotation": "-90",
    "fiducial": false
  }
]
[
  {
    "file": "PDF/College RS 4 D.pdf",
    "rotation": "-90",
    "fiducial": false
  }
]
[
    {
        "file": "PDF/Q College.pdf",
        "rotation": "90",
        "fiducial": "false"
    }
]
[
    {
        "file": "PDF/Test_q2c.pdf",
        "rotation": "90",
        "fiducial": "true",
        "nopdf": "true"
    }
]
[
    {
        "file": "PDF/Test_q2c.pdf",
        "rotation": "90",
        "fiducial": "true",
        "x":"false"
    }
]
[
  {
    "file": "PDF/Test q2b.pdf",
    "rotation": "90",
    "fiducial": false
  }
]
[
  {
    "file": "PDF/Test questionnaires.pdf",
    "rotation": "90",
    "fiducial": false
  }
]

[
  {
    "file": "PDF/XCollege Bourail 4 B pdf.pdf",
    "rotation": "-90",
    "fiducial": false
  }
]
[
  {
    "file": "PDF/test rotate.pdf",
    "rotation": "90",
    "fiducial": false
  }
]

我需要使用文件名作为键来提取每个对象,这是由

jq -r ".[] | select(.file | contains("q2c"))"

不幸的是,存在冲突,当对象不是唯一的时,我需要合并它们。例如得到的答案:

{
  "file": "PDF/Test_q2c.pdf",
  "rotation": "90",
  "fiducial": "true",
  "nopdf": "true"
}
{
  "file": "PDF/Test_q2c.pdf",
  "rotation": "90",
  "fiducial": "true",
  "x":"false"
}

预期答案

{
  "file": "PDF/Test_q2c.pdf",
  "rotation": "90",
  "fiducial": "true",
  "nopdf": "true",
  "x":"false"
}

我尝试.|group_by(.file)[]|add但没有成功...在此先感谢。

标签: mergejq

解决方案


add对于相对较小的输入流,您可以使用函数和-s命令行选项“啜饮”对象并将它们组合成一个数组:

jq --slurp 'add | map(select(.file | contains("q2c"))) | add'

推荐阅读