使用jq,如何从JSON数据的嵌套数组中准确地获取嵌套值?

使用jq,如何从JSON数据的嵌套数组中准确地获取嵌套值?,json,jq,Json,Jq,我有一个JSON文件,看起来像这样: { "people": { "names": [{ "last_name": "Smith", "first_names": [{ "name": "Bill" }, { "name": "Alic

我有一个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"
                    }
                ]
            }
        ]
    }
}
jq -r '.people | "\(.names[].last_name), \(.names[].first_names[].name)"' nameFile.json | sort
我想要的输出是:

Smith, Bill
Smith, Alice
Smith, Mary
Brown, Gil
Brown, Bob
Brown, Mary
Sanchez, Gil
Sanchez, Jose
Sanchez, Marlena
我创建了一个jq查询,如下所示:

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

显然这是不正确的,我可以理解其中的原因:第二个表达式忠实地遍历names数组中的每个匹配项。但是我看不出如何解决这个问题。

要得到想要的结果,你必须迭代
。名称
在迭代
的循环之外。名字

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

出于您的考虑,这里还有一个针对您问题中JSON操作的替代(即非jq)解决方案,基于unix漫游路径实用程序jtc:
我刚刚通过
jq-r.people |.names[]|“\(.last_name,.first_name[].name)更进一步'nameFile.json
。它打印姓氏,然后是相关的名字。我正朝着这个方向努力,但感谢@peak为我加快了速度:)