JSON形式のファイルを整形・集計したりするjqコマンドのインストールと使い方
JSON形式のファイルをCSV形式に変換したり、整形・集計など色々加工したい場合にjqをいれておくと便利です。
インストールはこちらです。OSにおわせてダウンロードします。Windowsの場合はexeをダウンロードし、パスを通すだけです。以下に配置しパスを通します。
D:¥jq¥jq.exe
ファイルに対して|(パイプ)でjqコマンドを使います。
バージョンは-Vオプションです。
D:\jq>jq -V jq-1.6
以下のJSONファイルがあります。
{ "aa": [ "bb", "cc" ], "dd": "ee", "ff": { "gg": "hh", "ii": "jj" } }
ドットがルートと考えます。
D:¥jq>type sample.json | jq "." { "aa": [ "bb", "cc" ], "dd": "ee", "ff": { "gg": "hh", "ii": "jj" } }
ドットにキーを付けてvalueを取得します。
D:¥jq>type sample.json | jq ".aa" [ "bb", "cc" ]
ドットにキーを付けてさらにドットにキーを付けてvalueを取得します。
D:¥jq>type sample.json | jq ".ff.gg" "hh"
色々公式サイトを見ながら試すと集計したり加工したりすることができるようです。
基本的にはkeyに対してvalueを表示する、という感じです。keyはダブルクォーテーションで囲みます。
ダブルクォーテーションを消したい場合は-rオプションを使います。
D:¥jq> type sample.json | jq -r ".ff.gg" hh
JSONの配列を操作する
JSONの配列を操作してみます。以下のsample.jsonというファイルがあるとします。
{ "items": [ { "price": 200, "item": "a" }, { "price": 3000, "item": "b" } ] }
配列を表示する
配列の添え字を省略すると全要素が表示されます。
D:¥jq>type sample.json | jq ".items[]" { "price": 200, "item": "a" } { "price": 3000, "item": "b" }
基底値は0なので、この辺はJavaなどと同じく[0]とすればその要素が取得できます。
D:¥jq>type sample.json | jq ".items[0]" { "price": 200, "item": "a" } D:¥jq>type sample.json | jq ".items[1]" { "price": 3000, "item": "b" } D:¥jq>type sample.json | jq ".items[2]" null
範囲外の要素を指定すると、nullとなるようです。
addで集計する
あるvalueの集計をしたい場合にaddを使います。
D:¥jq>type sample.json | jq ".items[].price" 200 3000
このpriceの合計を求める場合にaddを使用します。一旦[]で囲って、配列にしてからaddします。
D:¥jq>type sample.json | jq "[.items[].price] | add" 3200
lengthで配列長を求める
lengthから配列長を求めることができます。
D:¥jq>type sample.json | jq "[.items[].price] | length" 2
maxで最大値を求める
maxから最大値を求めることができます。
D:¥jq>type sample.json | jq "[.items[].price] | max" 3000
minで最小値を求める
minから最小値を求めることができます。
D:¥jq>type sample.json | jq "[.items[].price] | min" 200
JSONの任意のプロパティを削除する
delを使えば、深い階層のプロパティを削除したりすることができます。
キーが特定できない場合は[]とすることによって、その階層のキーを任意とすることができます。
type a.json | jq 'del(.["items"][]["x-amazon-apigateway-integration"]
JSONファイルを文字列にする(Linux)
JSONファイルの整形をやめて1行の文字列に変換するには-cオプションを使用します。
$ cat a.json | jq -c {"key1":"val1","key2":"val2"}
これを文字列に変換するにはパイプでjq -R
コマンドでつなぎます。
$ cat a.json | jq -c . | jq -R "{\"key1\":\"val1\",\"key2\":\"val2\"}"

KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント