Я пытаюсь объединить вложенные массивы в один объект, чтобы выполнить некоторую сортировку. Например, у меня есть следующее
{
"disk": [
{
"device": "/dev/sda",
"partitions": [
{ "type": "fat32", "mount": "/efi" },
{ "type": "ext4", "mount": "/boot" }
]
},
{
"device": "/dev/sdb",
"partitions": [
{ "type": "xfs", "mount": "/" }
]
}
]
}
Я пытаюсь сказать: «дайте мне все разделы, где mount не равен нулю, отсортируйте их по монтированию, но включите в вывод имя их устройства».
Пока у меня есть jq -c '.disk[].partitions[] | select (.mount != null)'
, который дает мне правильные разделы как таковые:
{ "type": "xfs", "mount": "/" }
{ "type": "ext4", "mount": "/boot" }
{ "type": "fat32", "mount": "/efi" }
Однако я хотел бы получить родительское устройство как таковое:
{ "type": "xfs", "mount": "/", "device": "/sdb" }
{ "type": "ext4", "mount": "/boot", "device": "/sda" }
{ "type": "fat32", "mount": "/efi", "device": "/sda" }
Я видел и другие примеры, в которых родительский элемент удаляется, а затем подключаются дочерние элементы, но, похоже, это не работает, когда сам родитель является массивом. Есть ли способ сказать «получить дочернюю собственность», например ... | .device = ..device
Мне нужны родительские каталоги перед дочерними каталогами. Так что мне это нужно в порядке /, /home, /home/foo;
Вы можете обогащать разделы устройством и фильтровать обогащенные разделы:
jq '.disk[]
| .device as $d
| .partitions[] += { device: $d }
| .partitions[]
| select(.mount != null)
' file.json
Вам не нужно возвращаться на один уровень назад, чтобы получить устройство. Просто получите его копию, выберите разделы и соедините их вместе.
.disk
| map((.partitions[] | select(.mount != null)) + {device})
| sort_by(.mount)[]
Вы имели в виду группу под
.mount
? Попытка понять необходимость сортировки здесь