jq 将相同键的值合并到一个数组中?

tom*_*ato 3 linux jq

我有一个以 1:1 映射形式导出为 JSON 的 SQL 结果集。

例如

[
  {
    "subject": "Accounting",
    "level": "A Level"
  },
  {
    "subject": "Accounting",
    "level": "IB"
  },
  {
    "subject": "Accounting",
    "level": "University"
  },
  {
    "subject": "Accounting",
    "level": "GCSE"
  },
  {
    "subject": "Accounting",
    "level": "Mentoring"
  },
  {
    "subject": "Accounting",
    "level": "13 Plus"
  },
  {
    "subject": "Accounting",
    "level": "11 Plus"
  },
etc.....
Run Code Online (Sandbox Code Playgroud)

我想将这些级别合并为一个主题键,如下所示:

[
   "Accounting": ["A Level", "IB", "University"],
   "Foo": ["Foo Intro", "Foo Basics", "Intermediate Foo"] 
]
Run Code Online (Sandbox Code Playgroud)

注意:没有匿名对象

我怎样才能用 jq 实现这一点?

ste*_*ver 5

给定的

$ jq '.' file.json
[
  {
    "subject": "Accounting",
    "level": "A Level"
  },
  {
    "subject": "Foo",
    "level": "IB"
  },
  {
    "subject": "Accounting",
    "level": "University"
  },
  {
    "subject": "Foo",
    "level": "GCSE"
  },
  {
    "subject": "Accounting",
    "level": "Mentoring"
  },
  {
    "subject": "Accounting",
    "level": "13 Plus"
  },
  {
    "subject": "Foo",
    "level": "11 Plus"
  }
]
Run Code Online (Sandbox Code Playgroud)

然后从Reshape 中大量借用汇总数据的 jq 数组

$ jq 'reduce .[] as $d (null; .[$d.subject] += [$d.level])' file.json 
{
  "Accounting": [
    "A Level",
    "University",
    "Mentoring",
    "13 Plus"
  ],
  "Foo": [
    "IB",
    "GCSE",
    "11 Plus"
  ]
}
Run Code Online (Sandbox Code Playgroud)

注意:外层是一个对象而不是一个数组(如您预期的输出 - 它似乎不是有效的 JSON)。