JSON の整形・検索・CSV 変換ができる jq コマンド応用編

便利ワザ

jq コマンド応用編として、整形・検索・CSV 変換の手順を解説します。
それぞれ jq コマンド単体で完了するため便利に使えます。

jq コマンドのインストールや基本操作については、下記の記事を参照ください。

⇒ jq コマンドの使い方 基本編
⇒ jq コマンドのインストール手順 (CentOS)



JSON サンプルデータ

今回は、以下の JSON をサンプルデータとして使用します。

{"users":[{"id":1001,"name":"yamada","age":30},{"id":1002,"name":"tanaka","age":25},{"id":1003,"name":"kimura","age":20}]}

整形すると以下の通りです。3人のユーザデータが含まれています。

$ cat json | jq .
{
  "users": [
    {
      "id": 1001,
      "name": "yamada",
      "age": 30
    },
    {
      "id": 1002,
      "name": "tanaka",
      "age": 25
    },
    {
      "id": 1003,
      "name": "kimura",
      "age": 20
    }
  ]
}

JSON の値で絞り込む select 関数

文字列検索

JSON に含まれる値を使って絞り込みが可能です。
.users[] の中から、名前が tanaka の項目のみを抽出します。

$ cat json | jq '.users[] | select(.name == "tanaka")'
{
  "age": 25,
  "name": "tanaka",
  "id": 1002
}

.users[] の後に select(.name =="tanaka") を入れるのがポイントです。
select(.users.[].name == "tanaka") と一度に指定すると上手く動きません。

数値比較

30歳未満のユーザを抽出する場合は、以下のコマンドとなります。

$ cat json | jq '.users[] | select(.age < 30)'
{
  "age": 25,
  "name": "tanaka",
  "id": 1002
}
{
  "age": 20,
  "name": "kimura",
  "id": 1003
}

jq コマンドで JSON の値を変更・整形する

JSON に含まれるデータの加減算や、値の上書きといった変更も jq で行えます。

数値演算

全員の年齢に +1 した上で表示させます。

$ cat json | jq '.users[].age + 1'
31
26
21

文字列上書き

指定したキーの中身(値)を書き換えることができます。
名前が kimura となっているデータを suzuki に置き換える例です。

$ cat json | jq '.users[] | select(.name == "kimura") | .name = "suzuki"'
{
  "age": 20,
  "name": "suzuki",
  "id": 1003
}

jq コマンドで JSON を CSV に変換する

jq コマンドは、JSON を CSV に変換する機能も備えています。
まずは、1行に値が横並びとなるように加工します。

$ cat json | jq '.users[] | [.id,.name,.age]'
[
  1001,
  "yamada",
  30
]
[
  1002,
  "tanaka",
  25
]
[
  1003,
  "kimura",
  20
]

不要な改行を除去するために、-c オプションを追加します。

$ cat json | jq -c '.users[] | [.id,.name,.age]'
[1001,"yamada",30]
[1002,"tanaka",25]
[1003,"kimura",20]

この状態で @csv に値を渡すと、CSV として出力されます。

$ cat json | jq -r -c '.users[] | [.id,.name,.age] | @csv'
1001,"yamada",30
1002,"tanaka",25
1003,"kimura",20

まとめ

jq コマンドの応用編として、絞り込みや CSV 出力の方法を解説しました。
簡単な JSON の加工であれば jq 単体でも対応可能です。

REST API の普及に伴い、JSON を利用する場面も増えてきました。
機会があれば、ぜひ jq コマンドでの整形・加工をお試しください。

【関連記事】
⇒ jq コマンドの使い方 基本編
⇒ jq コマンドのインストール手順 (CentOS)
⇒ MongoDB のインストール手順 (CentOS)
⇒ 開けないファイルの調査コマンドを解説
⇒ MySQL クエリの整形・CSV 出力方法