jqは同じキーの値を配列にマージしますか?

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.....

次のようにレベルをトピックキーに結合したいと思います。

[
   "Accounting": ["A Level", "IB", "University"],
   "Foo": ["Foo Intro", "Foo Basics", "Intermediate Foo"] 
]

メモ:匿名オブジェクトなし

jqを使用してこれをどのように達成できますか?

ベストアンサー1

与えられた

$ 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"
  }
]

それではお金を借りてください。要約データを使用してjq配列の外観を変更する

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

注:外部レイヤーは配列ではないオブジェクトです(予想される出力で見られるように、有効なJSONではないようです)。

おすすめ記事