Help us understand the problem. What is going on with this article?

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

yoza
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away