【发布时间】:2020-01-24 21:14:18
【问题描述】:
我有一个如下所示的 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
显然这是不正确的,我可以看出原因:第二个表达式忠实地遍历了 names 数组中的每个匹配项。但我不知道如何解决这个问题。
【问题讨论】:
-
供您考虑,这里还有一个 alternative(即非 jq)解决方案,用于您问题中的 JSON 操作,基于 unix walk-path i> 实用程序 jtc:
<file.json jtc -w'[last_name]:<L>P:[-1]<name>l:' -T'"{L}, {}"' -qq。如果您有兴趣,请告诉我 - 我可以在单独的答案中详细说明工具的使用。 (PS。我是该工具的开发者) -
我与
jq -r '.people | .names[] | "\(.last_name, .first_name[].name)' nameFile.json的距离更近了一步。打印姓氏,后跟相关的名字。