jqコマンドでJSONオブジェクトのキーと値を入れ替える方法

Nid: 813

サンプルデータ

$ cat s.json 
[
    {
        "name": "看護師",
        "keys": ["A", "B"]
    },
    {
        "name": "調理師",
        "keys": ["A", "C"]
    },
    {
        "name": "薬剤師",
        "keys": ["C"]
    },
    {
        "name": "宅建士",
        "keys": ["A", "B", "C"]
    }
]

値とキーのペアに分解

$ jq 'map({ name, key: .keys[] })' s.json 
[
  {
    "name": "看護師",
    "key": "A"
  },
  {
    "name": "看護師",
    "key": "B"
  },
  {
    "name": "調理師",
    "key": "A"
  },
  {
    "name": "調理師",
    "key": "C"
  },
  {
    "name": "薬剤師",
    "key": "C"
  },
  {
    "name": "宅建士",
    "key": "A"
  },
  {
    "name": "宅建士",
    "key": "B"
  },
  {
    "name": "宅建士",
    "key": "C"
  }
]

キーでグルーピング

$ jq 'map({ name, key: .keys[] }) | group_by(.key)' s.json 
[
  [
    {
      "name": "看護師",
      "key": "A"
    },
    {
      "name": "調理師",
      "key": "A"
    },
    {
      "name": "宅建士",
      "key": "A"
    }
  ],
  [
    {
      "name": "看護師",
      "key": "B"
    },
    {
      "name": "宅建士",
      "key": "B"
    }
  ],
  [
    {
      "name": "調理師",
      "key": "C"
    },
    {
      "name": "薬剤師",
      "key": "C"
    },
    {
      "name": "宅建士",
      "key": "C"
    }
  ]
]

mapでまとめる

$ jq 'map({ name, key: .keys[] }) | group_by(.key) | map({ key: .[0].key, value: map(.name) })' s.json 
[
  {
    "key": "A",
    "value": [
      "看護師",
      "調理師",
      "宅建士"
    ]
  },
  {
    "key": "B",
    "value": [
      "看護師",
      "宅建士"
    ]
  },
  {
    "key": "C",
    "value": [
      "調理師",
      "薬剤師",
      "宅建士"
    ]
  }
]