Как использовать 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
,