ストリーミング
--stream オプションを使うと、jqは入力テキストをストリーミング形式で解析できます。そのため、大きなJSONテキストを、解析が完了してからではなく、すぐに処理し始められます。1GBの単一のJSONテキストがある場合、ストリーミングによって、より早く処理できます。
ただし、ストリーミングを扱うのは簡単ではありません。jqプログラムの入力が、[<path>, <leaf-value>] や、いくつかの別の形式になるためです。
ストリームを扱いやすくするため、いくつかの組込み関数があります。
以下の例では、["a",["b"]] のストリーミング形式を使います。これは [[0],"a"],[[1,0],"b"],[[1,0]],[[1]] です。
ストリーミング形式には、[<path>, <leaf-value>](スカラー値、空の配列、空のオブジェクトを示すもの)と、[<path>](配列またはオブジェクトの終わりを示すもの)が含まれます。将来のjqを --stream と --seq で実行した場合、入力テキストの解析に失敗したときに、["error message"] のような追加の形式を出力する可能性があります。
truncate_stream(stream_expression)
数値を入力として受け取り、指定したストリーミング式の出力から、その数に対応する個数のパス要素を左側から切り落とします。
実行例 1
コマンド
jq 'truncate_stream([[0],"a"],[[1,0],"b"],[[1,0]],[[1]])'入力
1出力 1
[[0],"b"]出力 2
[[0]]fromstream(stream_expression)
ストリーム式の出力に対応する値を出力します。
実行例 1
コマンド
jq 'fromstream(1|truncate_stream([[0],"a"],[[1,0],"b"],[[1,0]],[[1]]))'入力
null出力 1
["b"]tostream
組込み関数 tostream は、入力のストリーミング形式を出力します。
実行例 1
コマンド
jq '. as $dot|fromstream($dot|tostream)|.==$dot'入力
[0,[1,{"a":1},{"b":2}]]出力 1
true