LoginSignup
4
2

More than 5 years have passed since last update.

jqを使って {"日付": {"number": XX}} を {"date": "日付", "number": xx}に整形する

Posted at

はじめに

jq という JSONを整形してくれるツールは便利なのですが、いつも JSONのkeyが不定の場合(例えばkeyが日付)に悩んでしまっていたのですが、解法を見つけたのでメモっておきます。

{"日付": {"number": XX}}{"date": "日付", "number": xx} に整形する

例えば以下のようなJSONがあったとします。

sample.json
{
  "2016-11-01": {"number": 100},
  "2016-11-02": {"number": 110},
  "2016-11-03": {"number": 120},
  "2016-11-04": {"number": 130}
}

これを

{
  "date": "2016-11-01",
  "number": 100
}
{
  "date": "2016-11-02",
  "number": 110
}
{
  "date": "2016-11-03",
  "number": 120
}
{
  "date": "2016-11-04",
  "number": 130
}

にしたいときは、

example
jq 'to_entries[] | {date: .key, number: .value.number}' < sample.json

でいけます。

ちょっと説明

ポイントは to_entries で、

example
jq 'to_entries' < sample.json

は ↓ のようになります。

output
[
  {
    "key": "2016-11-01",
    "value": {
      "number": 100
    }
  },
  {
    "key": "2016-11-02",
    "value": {
      "number": 110
    }
  },
  {
    "key": "2016-11-03",
    "value": {
      "number": 120
    }
  },
  {
    "key": "2016-11-04",
    "value": {
      "number": 130
    }
  }
]

あとは普通に整形していけば良いというわけです。

おまけ: CSVやTSVにしたいとき

ちなみに csv や tsv として出力したい場合は -r オプションと最後に@csv@tsv を付けると良いです。

example
% jq -r 'to_entries[] | [ .key,  .value.number ] | @tsv ' < sample.json
2016-11-01      100
2016-11-02      110
2016-11-03      120
2016-11-04      130

さいごに

微妙な悩みが解決してスッキリしました...

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2