こんなネストされたJSONをjqコマンドで値を取得したり集計したりする時のメモ
sample.json
{
"ok": true,
"messages": [
{
"text": "カレー食べた",
"reply_count": 1,
"reactions": [
{
"name": "+1",
"count": 2
},
{
"name": "clap",
"count": 1
}
]
},
{
"text": "家系ラーメン食べた",
"reply_count": 4,
"reactions": [
{
"name": "+1",
"count": 5
},
{
"name": "clap",
"count": 3
},
{
"name": "blush",
"count": 4
}
]
}
]
}
##messagesの各要素について取得してみる
###①textだけを取得
$cat sample.json | jq ".messages[].text"
"カレー食べた"
"家系ラーメン食べた"
###②text ・ reply_countを取得
$cat sample.json | jq ".messages[] | [.text, .reply_count]"
"カレー食べた", 1
"家系ラーメン食べた", 4
###③text ・ reply_count ・ reactionsのcoment合計を取得
$cat sample.json | jq ".messages[] | [.text, .reply_count, ([.reactions[]?.count] | add)]"
"カレー食べた", 1, 3
"家系ラーメン食べた", 4, 12
reactionsがnullの場合のエラーを無視するために?
をつける。この?
で大分詰まったけど普通にドキュメントに書いてあってまずドキュメント見なかった自分を蹴りたくなった。
また、add
で合計を取得する時は配列を与える必要があるので.reactions[]?.count
を[]
で囲む。
##messages全体の数値を取得してみる
###①messagesの要素数を取得
$cat sample.json | jq "[.messages[]] | length"
2
add
の時と同様.messages[]
を[]
で囲む。囲まないとmessagesの各要素の要素数が出てしまう。(ここでいうと3, 3)
###②reply_countの合計を取得
$cat sample.json | jq "[.messages[].reply_count] | add"
5
###③全reactionsのcoment合計を取得
$cat sample.json | jq "[.messages[].reactions[]?.count] | add"
15
###① ~ ③をまとめて取得
$cat sample.json | jq "[([.messages[]] | length), ([.messages[].reply_count] | add), ([.messages[].reactions[]?.count] | add)]"
2, 5, 15
または
$cat sample.json | jq "{ message: [.messages[]] | length, reply: [.messages[].reply_count] | add, reaction: [.messages[].reactions[]?.count] | add }"
{
"message": 2,
"reply": 5,
"reaction": 15
}