Как использовать jq для вывода JSONL (один независимый объект JSON на строку)

Моя просьба звучит тривиально, но я не смог найти способ сделать это. Я имею в качестве входных данных массив объектов JSON:

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

и я хочу в качестве вывода JSONL-версию того же, иначе один объект на строку, а не массив:

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

Это не то же самое, что использование --compact-output, так как это сохранит массив и даст мне:

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

Заранее спасибо.

2 ответа

Ответ на оригинальный вопрос заключается в использовании фильтра .[] вместе с -c опция командной строки:

$ jq -c '.[]'

Если входной массив слишком велик для размещения в памяти, вы можете использовать так называемый "потоковый анализатор" jq.

Вот иллюстрация, использующая общий подход, то есть он не делает никаких предположений относительно элементов в массиве верхнего уровня:

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

Найдено: это

map(tostring) | reduce .[] as $item (""; . + $item + "\n")

Вы также должны использовать --raw-output,

Другие вопросы по тегам