Как отсортировать json файл по ключам и значениям этих ключей в jq
Мы создаем веб-сайт, используя библиотеку Pentaho CTools, в которой есть графический редактор панели инструментов, который записывает файлы формата JSON для части панели инструментов.
Я хотел бы применить преобразование к этим файлам перед регистрацией до git, чтобы отсортировать их по ключу, а затем по значению определенных ключей. Цель состоит в том, чтобы сделать различия легче, поскольку редактор имеет привычку переупорядочивать все json-поля.
Например, у нас может быть что-то вроде этого:
{
"components": {
"rows": [
{
"id": "CHARTS",
"name": "Charts",
"parent": "UnIqEiD",
"properties": [
{
"name": "Group",
"type": "Label",
"value": "Charts"
}
],
"type": "Label",
"typeDesc": "<i>Group</i>"
},
{
"id": "kjalajsdjf",
"meta_cdwSupport": "true",
"parent": "CHARTS",
"properties": [
{
"name": "name",
"type": "Id",
"value": "Value1"
},
{
"name": "title",
"type": "String",
"value": "Value2"
},
{
"name": "listeners",
"type": "Listeners",
"value": "[]"
},
...
Мы можем jq --sort-keys
(http://stedolan.github.io/jq/) сортировать все ключи, но я изо всех сил пытаюсь выяснить, как для использования функции sort_by
для сортировки определенных определенных элементов по значению определенных ключей (так, в приведенном выше примере сортировка по properties.name
например. Любые идеи?
Ответы
Ответ 1
Хорошо с некоторой помощью по каналу IRC я нашел ответ.
В основном это выглядит так:
> jq '.components.rows|=sort_by(.id)|.components.rows[].properties|=sort_by(.name)' file.json > out.json
Итак, вы выбираете нужный объект, если хотите, в массивы, а затем sort_by просто берет одно значение (я пытался sort_by(.components.rows.id)
, который не удался).
the | = вместо | пропускает значения, а не снимает их.
Ответ 2
Если вы хотите отсортировать файл по атрибутам, эта команда может быть полезна:
jq -S '.' "$file" > "$file"_sorted;