如何用jq提取JSON不同分组键下的所有name字段值?
正确提取JSON多组数组内name字段的jq命令
问题背景
原始JSON数据:
{ "group1": [ { "name": "name_AAA", "size": 1 }, { "name": "name_BBB", "size": 2 } ], "group2": [ { "name": "name_CCC", "size": 3 }, { "name": "name_DDD", "size": 4 } ] }
需要提取所有name字段的值,期望输出:
name_AAA name_BBB name_CCC name_DDD
尝试执行了以下命令:
$ jq -r '.group1[] * .group2[] | .name' < "mydata.json"
但得到不符合预期的输出:
name_CCC name_CCC name_DDD name_DDD
求正确的jq命令写法。
问题分析
你用的*是jq的对象合并操作符,.group1[] * .group2[]会对group1的每个对象和group2的每个对象做笛卡尔积合并,合并时后面对象的字段会覆盖前面的,所以最终取.name时只会得到group2里的name值,再加上笛卡尔积的重复次数,就出现了重复输出的情况。
正确命令示例
写法1:合并数组后提取
先把group1和group2的数组合并成一个数组,再遍历提取每个元素的name:
jq -r '.group1 + .group2 | .[] | .name' mydata.json
写法2:分别提取再输出
直接依次提取两个数组的所有name字段,jq会自动按顺序输出结果:
jq -r '.group1[].name, .group2[].name' mydata.json
写法3:通用处理所有数组(适用于多组场景)
如果JSON里还有更多类似group的数组键,可以直接遍历所有顶层值(即所有数组),再提取每个元素的name:
jq -r '.[] | .[] | .name' mydata.json
以上三种写法都能得到你想要的输出结果。
内容的提问来源于stack exchange,提问作者AMA
相关产品推荐
相关产品推荐

