30
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

jqでsortする

Last updated at Posted at 2016-08-23

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

30
21
0

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
  3. You can use dark theme
What you can do with signing up
30
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?