Используя jq, как я могу точно получить вложенные значения из вложенных массивов из данных JSON? - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть файл JSON, который выглядит примерно так:

{
    "people": {
        "names": [{
                "last_name": "Smith",
                "first_names": [{
                        "name": "Bill"
                    },
                    {
                        "name": "Alice"
                    },
                    {
                        "name": "Mary"
                    }
                ]
            },
            {
                "last_name": "Brown",
                "first_names": [{
                        "name": "Gil"
                    },
                    {
                        "name": "Bob"
                    },
                    {
                        "name": "Mary"
                    }
                ]
            },
            {
                "last_name": "Sanchez",
                "first_names": [{
                        "name": "Gil"
                    },
                    {
                        "name": "Jose"
                    },
                    {
                        "name": "Marlena"
                    }
                ]
            }
        ]
    }
}

Вывод, который я ищу:

Smith, Bill
Smith, Alice
Smith, Mary
Brown, Gil
Brown, Bob
Brown, Mary
Sanchez, Gil
Sanchez, Jose
Sanchez, Marlena

Я создал запрос jq, который выглядит следующим образом:

jq -r '.people | "\(.names[].last_name), \(.names[].first_names[].name)"' nameFile.json | sort

Но я получаю вывод:

Brown, Alice
Brown, Bill
Brown, Bob
Brown, Gil
Brown, Gil
Brown, Jose
Brown, Marlena
Brown, Mary
Brown, Mary
Sanchez, Alice
Sanchez, Bill
Sanchez, Bob
Sanchez, Gil
Sanchez, Gil
Sanchez, Jose
Sanchez, Marlena
Sanchez, Mary
Sanchez, Mary
Smith, Alice
Smith, Bill
Smith, Bob
Smith, Gil
Smith, Gil
Smith, Jose
Smith, Marlena
Smith, Mary
Smith, Mary

Очевидно, что это не правильно, и я могу понять почему: второе выражение точно проходит через каждое совпадение вмассив имен.Но я не вижу, как это исправить.

1 Ответ

1 голос
/ 24 сентября 2019

Чтобы получить желаемые результаты, вы должны перебрать .names вне цикла, который перебирает .first_names:

.people
| .names[]
| "\(.last_name), \(.first_names[].name)"
...