search
LoginSignup
19

More than 5 years have passed since last update.

posted at

updated at

jqでsortする

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()以外にもたくさんの関数が載っていたり正規表現が使えたりするみたいなのでもっと複雑な処理もできそう。

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
What you can do with signing up
19