Edited at

jqでsortする

More than 3 years have passed since last update.


jqとは?

jqはjsonのデータから目的の部分を切り出したり集計したりできるCLIのツール


前提

こんなデータがあったとする。


input.json

{

"hoge": [
{ "id": 1, "name": "foo", "age": 20 },
{ "id": 2, "name": "bar", "age": 23 },
{ "id": 3, "name": "baz", "age": 20 },
{ "id": 4, "name": "qux", "age": 18 }
]
}


jqを使ってsortする

このjsonからhogeの中身をageで昇順にしたい場合は

$ cat input.json | jq '.hoge | sort_by(.age)'

[
{ "id": 4, "name": "qux", "age": 18 },
{ "id": 1, "name": "foo", "age": 20 },
{ "id": 3, "name": "baz", "age": 20 },
{ "id": 2, "name": "bar", "age": 23 }
]

※ 見やすくするために出力を一部整形しています


何をしているのか軽く説明


  • 最初に.hogeフィルターで結果をhogeの中身の配列に絞り込む


  • |を使うことによってshellのパイプのように左辺の出力を右辺の入力として受け渡す


  • sort_by()関数を用いてageの昇順でsortする

降順にしたい場合はreverseで逆順にすればよい

$ cat input.json | jq '.hoge | sort_by(.age) | reverse'

[
{ "id": 2, "name": "bar", "age": 23 },
{ "id": 3, "name": "baz", "age": 20 },
{ "id": 1, "name": "foo", "age": 20 },
{ "id": 4, "name": "qux", "age": 18 }
]

sortした結果からnameだけ取得したい場合はmap()関数を使えばよい

$ cat input.json | jq '.hoge | sort_by(.age) | map(.name)'

[
"qux",
"foo",
"baz",
"bar"
]


まとめ

jqを使えばjsonからお目当てのデータをsortして取得するといったことが簡単にできる。

公式のManualにはsort_by()以外にもたくさんの関数が載っていたり正規表現が使えたりするみたいなのでもっと複雑な処理もできそう。