web-dev-qa-db-ja.com

jqを使用してJSONLを出力する方法(1行に1つの独立したJSONオブジェクト)

私の要求は些細なことのように聞こえますが、それを行う方法を見つけることができませんでした。入力としてJSONオブジェクトの配列があります。

[
    {
        "foo": 1,
        "bar": 2
    },
    {
        "foo": 3,
        "bar": 4
    },
    (...)
]

そして、出力として、同じもののJSONLバージョン、つまり配列ではなく、行ごとに1つのオブジェクトが必要です。

    { "foo": 1, "bar": 2 }
    { "foo": 3, "bar": 4 }
    (...)

これはnot--compact-outputを使用するのと同じです。これにより、配列が保持され、次のようになります。

    [ { "foo": 1, "bar": 2 }, { "foo": 3, "bar": 4 }, (...) ]

前もって感謝します。

18
giacecco

元の質問に対する答えは、フィルター.[]-cコマンドラインオプションと一緒に使用することです。

$ jq -c '.[]'
21
peak

入力配列が大きすぎてメモリに収まらない場合は、jqのいわゆる「ストリーミングパーサー」を使用できます。

これは、一般的なアプローチを使用した図です。つまり、最上位の配列の項目については何も想定していません。

$ echo '[{"foo":"bar"},99,null,{"foo":"baz"}]' |
  jq -cn --stream 'fromstream( inputs|(.[0] |= .[1:]) | select(. != [[]]) )'
{"foo":"bar"}
99
null
{"foo":"baz"}
$ 
0
peak