jq
tonumber
文字列で数値が入ってる時は比較しづらいので tonumber した値に更新する
jq '. | .event_time = (.event_time | tonumber)'
合計
Array | add
Array に対して pipe する必要がある、jq '[ .[] | .value | tonumber ] | add' など
and
複数の条件のときは and、&& はない
jq '. | select(1541862000 <= .event_time and .event_time < 1541948400)
Array と select
select は array を受けないので
jq '.items[] | select(.field == "foo")' すると要素ごとに出力される
jq '.items | map(select(.field == "foo"))' など map すると Array が得られる、あるいは
jq '[ .items[] | select(.field == "foo") ]' などで Array を作ってもよい
select がなんかうまくいかないとき
== にしているか?
jq '.[] | select(.foo="bar")' などしていると、= は代入で真になっているだけだったりする
-r
出力結果を装飾しないやつ
クオートを消したり改行文字をそのまま改行として出力したり
色つけたまま less したい
-C, --color-output
-C colorize JSON; を使う、pipe 先が console じゃなかったら色消してる(はず)
$ jq -C '.' | less
逆にカラーコードを消すのは -M(monochrome)
sort
sort_by
複数のフィールドで結合してやる
$ jq 'sort_by(.area_name + .pref_name + .id)'
$ jq 'sort_by(.name + (.age|tostring))'
-S, --sort-keys
リダイレクトで書き出せばソート済みにはなる
組み立て系
as で束縛
as $var で束縛して後で参照できる、
jq '.users[] | .name as $userName | .friends[] | [$userName, .name]
if
なんか | select(...) とかやっていたイメージと合ってないが if もある
jq '.users[] | [.name, (if .status == "pending" then "停止" else "有効" end)]'
// (alternative-operator)
左辺が false や nullのときに右辺にする、デフォルト値うめたり nullable array をいじるときに便利
jq '.users[] | (.friends // [])[] | .name'
出力フォーマット指定
jq ' ... | @csv' など
datastudio の CASE クエリを作る例
-r で raw outupt
単に文字列を結合すれば文字列作れる
jq -r '.[] | "WHEN category.name = \"" + .name + "\" THEN \"" + .display_name + "\""'