Как слить 2 json-файл с помощью jq?

Я использую jq– инструменты (jq-json-processor) в сценарии оболочки для анализа json.

У меня есть 2 json-файла и вы хотите объединить их в один уникальный файл

Здесь содержимое файлов:

file1

{ "value1": 200, "timestamp": 1382461861, "value": { "aaa": { "value1": "v1", "value2": "v2" }, "bbb": { "value1": "v1", "value2": "v2" }, "ccc": { "value1": "v1", "value2": "v2" } } } 

file2

 { "status": 200, "timestamp": 1382461861, "value": { "aaa": { "value3": "v3", "value4": 4 }, "bbb": { "value3": "v3" }, "ddd": { "value3": "v3", "value4": 4 } } } 

ожидаемый результат

 { "value": { "aaa": { "value1": "v1", "value2": "v2", "value3": "v3", "value4": 4 }, "bbb": { "value1": "v1", "value2": "v2", "value3": "v3" }, "ccc": { "value1": "v1", "value2": "v2" }, "ddd": { "value3": "v3", "value4": 4 } } } 

Я стараюсь много combinaison, но единственный результат, который я получаю, следующий: это не ожидаемый результат:

 { "ccc": { "value2": "v2", "value1": "v1" }, "bbb": { "value2": "v2", "value1": "v1" }, "aaa": { "value2": "v2", "value1": "v1" } } { "ddd": { "value4": 4, "value3": "v3" }, "bbb": { "value3": "v3" }, "aaa": { "value4": 4, "value3": "v3" } } 

Используя эту команду:

 jq -s '.[].value' file1 file2 

Начиная с 1.4, это возможно с помощью оператора * . При задании двух объектов он будет регрессировать их. Например,

 jq -s '.[0] * .[1]' file1 file2 

Вы получите:

 { "value1": 200, "timestamp": 1382461861, "value": { "aaa": { "value1": "v1", "value2": "v2", "value3": "v3", "value4": 4 }, "bbb": { "value1": "v1", "value2": "v2", "value3": "v3" }, "ccc": { "value1": "v1", "value2": "v2" }, "ddd": { "value3": "v3", "value4": 4 } }, "status": 200 } 

Если вы также хотите избавиться от других ключей (например, ожидаемого результата), один из способов сделать это:

 jq -s '.[0] * .[1] | {value: .value}' file1 file2 

Или, предположительно, несколько более эффективный (поскольку он не объединяет никаких других значений):

 jq -s '.[0].value * .[1].value | {value: .}' file1 file2 

Используйте jq -s add :

 $ echo '{"a":"foo","b":"bar"} {"c":"baz","a":0}' | jq -s add { "a": 0, "b": "bar", "c": "baz" } 

Это считывает все тексты JSON из stdin в массив ( jq -s делает это), затем он «уменьшает» их.

( add определяется как def add: reduce .[] as $x (null; . + $x); ;, который выполняет итерацию по значениям входного массива / объекта и добавляет их. Добавление объекта == merge.)

Кто знает, если вам все еще нужно, но вот решение.

Как только вы --slurp опции --slurp , это легко!

 --slurp/-s: Instead of running the filter for each JSON object in the input, read the entire input stream into a large array and run the filter just once. 

Тогда оператор + сделает то, что вы хотите:

 jq -s '.[0] + .[1]' config.json config-user.json 

(Примечание: если вы хотите объединить внутренние объекты, а не просто переписать левый файл с нужными файлами, вам нужно будет сделать это вручную)

Вот версия, которая работает рекурсивно (используя * ) на произвольном числе объектов:

 echo '{"A": {"a": 1}}' '{"A": {"b": 2}}' '{"B": 3}' | jq --slurp 'reduce .[] as $item ({}; . * $item)' { "A": { "a": 1, "b": 2 }, "B": 3 } 

Во-первых, {“значение”: .value} может быть сокращено до просто {value}.

Во-вторых, может быть интересен параметр -argfile (ansible в jq 1.4 и jq 1.5), поскольку он избегает использования опции -slurp.

Объединяя их, два объекта в двух файлах могут быть объединены следующим образом:

 $ jq -n --argfile o1 file1 --argfile o2 file2 '$o1 * $o2 | {value}' 

Флаг -n указывает jq не читать из stdin, так как входы поступают из параметров -argfile здесь.

  • Запустить командную строку в качестве администратора
  • Лучший анализатор CLI для Java
  • Как отправить ctrl + c процессу в c #?
  • Как передать аргументы командной строки программе Perl?
  • Как запустить TestNG из командной строки
  • Как выполнять команды через дочерний процесс NodeJS?
  • Как указать пароль для psql неинтерактивно?
  • Вход с клавиатуры в приложении командной строки
  • Как я могу перетасовать строки текстового файла в командной строке Unix или в сценарии оболочки?
  • Отладка с параметрами командной строки в Visual Studio
  • Как получить версию проекта Maven в командной строке bash
  • Interesting Posts

    Нужны некоторые примеры привязки атрибутов в пользовательских тегах AngularJS

    Как обновить iPhone SDK без повторной загрузки Xcode?

    Где Windows Vista хранит данные реестра на жестком диске?

    Регулярное выражение для буквенно-цифровых и подчеркиваний

    Подключение к удаленному рабочему столу Windows 10 с использованием учетных данных Azure AD

    Создайте простой обратный отсчет при обработке

    ‘Delegate’ System.Action ‘не принимает 0 аргументов.’ Является ли это ошибкой компилятора C # (lambdas + два проекта)?

    Любой способ заставить панель задач Windows спрятаться (если в режиме «автоматического скрытия»)

    Что означает поддержка «Legacy USB Mouse» в BIOS?

    Два маршрутизатора в одной подсети и VPN?

    css3 переход анимации при загрузке?

    Может ли PictureBox показывать анимированный GIF в приложении Windows?

    MATLAB находит и применяет функцию к значениям повторяющихся индексов

    Как добавить свойства в файл topojson?

    Дженкинс – передача переменных между заданиями?

    Давайте будем гением компьютера.