Извлечь дочерние элементы и добавить в них родительское поле

Я пытаюсь объединить вложенные массивы в один объект, чтобы выполнить некоторую сортировку. Например, у меня есть следующее

{
    "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

Вы имели в виду группу под .mount? Попытка понять необходимость сортировки здесь

Inian 15.12.2020 18:27

Мне нужны родительские каталоги перед дочерними каталогами. Так что мне это нужно в порядке /, /home, /home/foo;

esac 15.12.2020 18:41
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
2
671
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете обогащать разделы устройством и фильтровать обогащенные разделы:

jq '.disk[]
    | .device as $d
    | .partitions[] += { device: $d }
    | .partitions[]
    | select(.mount != null)
    ' file.json
Ответ принят как подходящий

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

.disk
| map((.partitions[] | select(.mount != null)) + {device})
| sort_by(.mount)[]

Online demo

Другие вопросы по теме