Как использовать jq для восстановления полного содержимого файла json, работая только с интересующей частью?

Все примеры, которые я видел до сих пор, «сокращают» вывод (отфильтровывают) какую-то часть. Я понимаю, как работать с той частью ввода, которую я хочу, но я не понял, как вывести остальную часть контента «нетронутой».

Конкретным примером может быть входной файл с несколькими записями высокого уровня, скажем, «массив1», «поле1», «массив2», «массив3». Содержимое каждого массива отличается. Конкретная обработка, которую я хочу сделать, - это отсортировать записи "array1" по полю "имя", которое выполнимо:

jq '.array1 | sort_by(.name)' test.json

но я также хочу сохранить этот вывод как «массив1», а также все остальные данные.

Пример ввода:

{
    "field1": "value1",
    "array1":
        [
            { "name": "B", "otherdata": "Bstuff" },
            { "name": "A", "otherdata": "Astuff" }
        ],
    "array2" :
        [
            array2 stuff
        ],
    "array3" :
        [
            array3 stuff
        ]
}

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

{
    "field1": "value1",
    "array1":
        [
            { "name": "A", "otherdata": "Astuff" },
            { "name": "B", "otherdata": "Bstuff" }
        ],
    "array2" :
        [
            array2 stuff
        ],
    "array3" :
        [
            array3 stuff
        ]
}

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


person user107172    schedule 20.12.2016    source источник


Ответы (1)


Всякий раз, когда вы используете операторы присваивания (=, |=, += и т. д.), контекст выражения остается неизменным. Так что, пока ваши фильтры верхнего уровня являются заданиями, в конце концов вы получите остальные данные (с внесенными вашими изменениями).

В этом случае вы просто сортируете массив array1, чтобы можно было просто обновить массив.

.array1 |= sort_by(.name)
person Jeff Mercado    schedule 21.12.2016