Объединить список json файлов, содержащих JSON массивы - PullRequest
0 голосов
/ 26 марта 2020

У меня есть список json файлов, таких как:

file1.json
[
  {obj1}
]

file2.json
[
  {obj2}
]

, и я хочу объединить их все в один файл:

[
  {obj1},
  {obj2}
]

Как мне добиться этого с помощью jq

Ответы [ 2 ]

3 голосов
/ 26 марта 2020

Вы можете использовать следующее:

jq -s 'add' file1.json file2.json

Использование -s режима lurp заставляет jq обрабатывать несколько входов за один проход, объединяя их в массив, содержащий ваши два массива. Мы можем объединить их в один, преобразовав входной массив с фильтром add, который выдает сумму каждого элемента, как если бы он использовал +; использование его в массивах возвращает один массив со всеми элементами обоих массивов.

1 голос
/ 26 марта 2020

Это можно сделать, вызвав jq два раза так:

jq -c '.[]' *.json | jq -s

Как это работает

*.json оценивается оболочкой и заменяется списком соответствий файлы. jq получает имена всех JSON файлов в текущем каталоге в качестве аргументов. Он читает их один за другим и запускает программу .[] на JSON-файлах, которые они содержат.

Каждый файл JSON содержит массив. .[] извлекает элементы из массива и выводит их.
-c говорит jq выводить каждое значение (элементы, извлеченные с помощью .[]) в одну строку.

Вывод первая команда jq состоит из одной строки для каждого объекта из массивов, хранящихся во входных файлах.

Этот вывод затем передается второй команде jq, чей аргумент -s указывает ей прочитать все (обычно он читает по одному JSON за один раз) и помещает все объекты, которые он декодирует из входных JSON, в массив. Это именно то, что вы хотите.

...