jq の入力・真偽・シェルとの受け渡し

結論 jq に渡す . や .branch のような式をフィルタと呼ぶ。jq の入力は「JSON 値の並び」で、フィルタは値ごとに動く。連結した JSON は値の数だけ結果を出し、壊れた箇所の手前の値は、終了コード 5 で失敗しても stdout に出る。1 値だけを受けるなら -s で全体を読み、length == 1 と型を確かめる -s は全部を読めてから配列を作るので、1 行でも壊れた JSON Lines (1 行に 1 つの JSON を書く形式) では何も出さない。壊れた行だけを捨てるなら -R と fromjson? を使う 偽になるのは false と null だけで、0・""・[] は真、無い項目は null になる。// は false も右辺に置き換える。フラグの判定は真偽でなく == false や > 0 の比較で書く ツリーを辿る recurse(.children[]) は children の無いノードで止まるので、エラーを捨てる ? を付ける。祖先の条件を子孫に効かせるなら、後段の select (条件が真の値だけを残す関数) でなく recurse(f; cond) に書く シェルとの境目では値の形が変わる。@tsv は \ を二重にし、IFS=$'\t' read は空の列を詰め、--arg (シェルの値を jq の変数に渡すオプション) の値は 1 個 128 KiB までしか渡せない。1 件ごとに jq を起動すると、jq 1 回で全件を出す形より桁で遅い 以下は jq 1.8.2 / GNU bash 5.3.20 / Linux x86_64 で実測した。出力の rc= は echo "rc=$?" で出した終了コードで、stderr のエラー文が stdout より先に並ぶのは、パイプへの stdout がバッファされ、終了時に書かれるためである。 ...

2026-11-09 ·  2026-11-09 · 9 分 · 1810 文字