У меня есть файлы, в которых есть N объектов JSON, и они разделены запятой (,)
{"a":1},{"b":2},{"c":3},{"d":2},{"e":1},{"f":2} ...
Я хотел бы преобразовать их в один массив JSON с N объектами, используя jq
[{"a":1},{"b":2},{"c":3},{"d":2},{"e":1},{"f":2} ...]
Я пробовал jq -R 'split(",")' myfile.json, но он дает мне массив из N строк
[
"{\"a\":1}",
"{\"b\":2}",
"{\"a\":1}",
"{\"b\":2}",
"{\"a\":1}",
"{\"b\":2}",
"{\"a\":1}",
"{\"b\":2}" ....
]
Любая идея?
Мой файл содержит миллионы объектов json, может быть, это неэффективный способ чтения всего файла?
Уточните, может ли какой-либо из объектов JSON содержать более одного ключа и может ли какое-либо из имен или значений ключей содержать запятую.

Вы на правильном пути, вам просто нужно сопоставить fromjson с массивом, например:
jq -Rc 'split(",") | map(fromjson)' myfile.json
Выход:
[{"a":1},{"b":2},{"c":3},{"d":2},{"e":1},{"f":2}]
Однако, если вы имеете дело с огромными входными данными, возможно, используйте более потоковую команду для разделения входных данных на фрагменты, например с tr:
<myfile.json tr ',' '\n' | jq -c .
Выход:
{"a":1}
{"b":2}
{"c":3}
{"d":2}
{"e":1}
{"f":2}
Поскольку у вас есть миллионы этих объектов JSON, позвольте мне сначала предложить эффективный способ создания потока из них в формате JSON-Lines (т. Е. С «новой строкой» в качестве разделителя).
ВНИМАНИЕ: СЛЕДУЮЩЕЕ ПРЕДПОЛАГАЕТСЯ, ЧТО ОБЪЕКТЫ НЕ СОДЕРЖАТ СТРОКИ JSON с запятыми.
Предположим, что разделенные запятыми объекты находятся в файле с именем objects.txt. Сначала создайте файл program.jq со следующей программой jq:
def one:
(try input catch null)
| if . == 0 then empty elif . == null then one else (., one) end;
one
Затем, если ваша оболочка позволяет это, вызов:
(cat objects.txt; echo 0) |
sed $'s/,/,\\\n/g' |
jq -n -c -f program.jq objects.txt
создаст поток, по одному объекту JSON на строку. Это очень удобный формат. Например, чтобы создать массив, вы можете направить вышеупомянутый поток в jq -s ..
Однако, если цель состоит исключительно в создании массива JSON, то, как указано в другом месте, наиболее эффективным подходом было бы заключить объекты, разделенные запятыми, в квадратные скобки вдоль строк:
(echo "["; cat objects.txt; echo "]")
Таким образом, уместным вопросом здесь, возможно, будет: какова настоящая цель? Кажется сомнительным, что наличие неуправляемого большого массива небольших объектов JSON может быть более полезным, чем исходная последовательность, разделенная запятыми, или простой поток.
Вероятно, проще всего просто заключить введенные вами данные в [.....]