はじめに
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
さいごに
微妙な悩みが解決してスッキリしました...