スクリプト入門:jqコマンドを使ったJSONデータの加工

スポンサーリンク
スクリプト入門:jqコマンドを使ったJSONデータの加工 ノウハウ
スクリプト入門:jqコマンドを使ったJSONデータの加工
この記事は約9分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、jqコマンドの使い方についてご紹介します。

スポンサーリンク

前提

この記事で使用しているjqコマンドのバージョンは下記になります。

% jq --version
jq-1.6

jqコマンドは下記のコマンドでインストールしました。

brew install jq

背景

RESTFful APIのレスポンスがJSON形式のときに、特定の要素だけを取得したい場面があり、jqコマンドを使用して、実現できましたので、備忘の意味も込めて、この記事に残しました。

jqコマンドとは

jqコマンドは、JSONデータを操作・抽出・変換するための強力なコマンドラインツールです。JSON(JavaScript Object Notation)は、データの表現によく使われる軽量で人間に読みやすい形式です。jqコマンドを使用すると、JSONデータをコマンドラインから直接処理し、必要な情報を取得したり、データを加工したりできます。

jqコマンドの主な特徴と使い方は以下のようになります:

  1. データの抽出とフィルタリング: jqコマンドを使用すると、JSONデータから必要な部分だけを抽出することができます。例えば、特定のキーの値を取得したり、条件に基づいてデータを絞り込んだりすることができます。
  2. データの変換: jqコマンドを使ってJSONデータの構造を変更することができます。例えば、JSONオブジェクトのキーを変更したり、新しいデータを追加したりすることが可能です。
  3. フィルタリングとマッピング: jqコマンドは、データの配列を操作する際にも非常に便利です。配列内の要素をフィルタリングしたり、新しい要素を追加したりすることが容易に行えます。
  4. 条件とループ: jqコマンドには条件文やループを利用することができます。これにより、複雑なJSONデータの操作や条件に基づいたデータの抽出が可能になります。

jqコマンドは、コマンドラインで直接利用することができるため、スクリプトやシェルの中で自動化された処理に組み込むこともできます。

例えば、以下のようなJSONデータがあるとします:

{
  "name": "John",
  "age": 30,
  "city": "New York",
  "hobbies": ["reading", "hiking", "swimming"]
}

jqコマンドを使用して、このデータから特定の情報を抽出する例を示します:

  • jq '.name': “John”と出力されます。
  • jq '.age': 30と出力されます。
  • jq '.hobbies | .[]': “reading”, “hiking”, “swimming”とそれぞれ改行して出力されます。

以上のように、jqコマンドはJSONデータを効率的に処理するための便利なツールです。

jqコマンドの使い方

jqコマンドはJSONデータを操作するための強力なコマンドラインツールです。以下に基本的な使い方と一般的なオプションを説明します。

jqコマンドの基本構文:

jq [options] filter [file]
  • options: jqコマンドのオプションを指定します。
  • filter: JSONデータを操作するためのフィルターを指定します。フィルターは、データを変換、抽出、絞り込むための式です。
  • file: オプションです。JSONデータが含まれたファイルを指定します。省略した場合、jqは標準入力からデータを受け取ります。

jqコマンドの一般的なオプション:

  • -r : ローレベル出力モード。文字列や数値などの生の値を出力します。
  • -c : コンパクトな出力モード。改行を含まないコンパクトな形式で出力します。
  • -M : 大きな数値の処理を禁止します。
  • --sort-keys : オブジェクトのキーをソートして出力します。

フィルターの構文はかなり柔軟で複雑な操作も可能です。詳細な情報については、jqコマンドのマニュアルページ(man jq)やオンラインドキュメントを参照してください。

使用例

オブジェクトのプロパティを抽出

% echo '{"name": "John", "age": 30}' | jq '.name'
"John"

プロパティの値を直接出力(ローレベルモード)

% echo '{"name": "John", "age": 30}' | jq -r '.name'
John

複数のプロパティを抽出

% echo '{"name": "John", "age": 30, "city": "New York"}' | jq '.name, .age'

"John"
30

配列の要素を抽出

% echo '[1, 2, 3, 4, 5]' | jq '.[]'

1
2
3
4
5

条件に基づくフィルタリング

% echo '{"name": "John", "age": 30, "city": "New York"}' | jq 'select(.age > 25)'

{
  "name": "John",
  "age": 30,
  "city": "New York"
}

オブジェクトのキーを変更

% echo '{"name": "John", "age": 30}' | jq '.["full_name"] = .name | del(.name)'

{
  "age": 30,
  "full_name": "John"
}

オブジェクトの結合

% echo '{"name": "John", "age": 30}' | jq '. + {"city": "New York"}'

{
  "name": "John",
  "age": 30,
  "city": "New York"
}

配列の要素をフィルタリング

% echo '[1, 2, 3, 4, 5]' | jq 'map(select(. > 2))'

[
  3,
  4,
  5
]

条件に基づくフィルタリング

% echo '{"name": "John", "age": 30, "city": "New York"}' | jq 'select(.age > 25)'

{
  "name": "John",
  "age": 30,
  "city": "New York"
}

複雑な条件の使用

% echo '{"name": "John", "age": 30, "city": "New York"}' | jq 'if .age > 25 then "adult" else "young" end'

"adult"

ループを使用して配列を変換

% echo '[1, 2, 3, 4, 5]' | jq 'map(. * 2)'

[
  2,
  4,
  6,
  8,
  10
]

複数のフィルターの組み合わせ

% echo '{"name": "John", "age": 30, "city": "New York"}' | jq '{status : (if .age > 25 then "adult" else "young" end) }'
{
  "status": "adult"
}

複雑なJSONファイルに対する操作

下記の内容でdata.jsonファイルを保存する。

{
  "employees": [
    {
      "id": 1,
      "name": "John Doe",
      "age": 30,
      "department": "HR",
      "skills": ["communication", "leadership"]
    },
    {
      "id": 2,
      "name": "Jane Smith",
      "age": 35,
      "department": "Finance",
      "skills": ["finance", "analysis"]
    }
  ],
  "departments": {
    "HR": ["John Doe", "Alice Johnson"],
    "Finance": ["Jane Smith", "Bob Williams"]
  }
}

従業員の名前と部署をリストする

% cat data.json | jq '.employees[] | "\(.name) works in \(.department)"'

"John Doe works in HR"
"Jane Smith works in Finance"

特定の部署の従業員のリストを取得する

% cat data.json | jq '.departments.HR'  

[
  "John Doe",
  "Alice Johnson"
]

特定のスキルを持つ従業員を抽出する

% cat data.json | jq '.employees[] | select(.skills | index("finance"))'

{
  "id": 2,
  "name": "Jane Smith",
  "age": 35,
  "department": "Finance",
  "skills": [
    "finance",
    "analysis"
  ]
}

年齢の平均値を計算する

% cat data.json | jq '[.employees[].age] | add / length'

32.5

従業員のスキルを結合して一意なリストを作成する

 cat data.json | jq '[.employees[].skills] | flatten | unique'

[
  "analysis",
  "communication",
  "finance",
  "leadership"
]

特定のキーワードを含む従業員を抽出する

% cat data.json | jq '.employees[] | select(.name | contains("Smith"))'

{
  "id": 2,
  "name": "Jane Smith",
  "age": 35,
  "department": "Finance",
  "skills": [
    "finance",
    "analysis"
  ]
}

おわりに

今日は、jqコマンドの使い方についてご紹介しました。

これらはjqコマンドの一部の使用例ですが、jqコマンドは非常に豊富な機能を持っているため、データ処理のニーズに応じてさまざまな方法で活用できます。詳細な情報については、公式のjqドキュメントを参照することをおすすめします。

よっしー
よっしー

何か質問や相談があれば、遠慮なくコメントしてください。また、エンジニア案件についても、いつでも相談にのっていますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました