jq多筛选操作失效:无法正确提取成员最高等级证书信息
问题描述
修正后的示例JSON(原JSON存在语法错误,已补全缺失逗号)
{"member": [ { "firstName": "Paul", "lastName": "Simons", "certificates": [ { "status" : "Pass", "grade" : { "type" : "music", "level" : 3 }, "awardDate" : "2023-01-28" }, { "status" : "Pass", "grade" : { "type" : "sports", "level" : 2 }, "awardDate" : "2021-02-02" }, { "status" : "Pass", "grade" : { "type" : "music", "level" : 2 }, "awardDate" : "2021-02-02" } ] } ]}
需求
列出每位成员的姓名、各证书类型对应的最高等级(支持两种判断逻辑:等级高低/最新获取日期)的等级类型、等级及获取日期,期望输出:
Paul Simons, [music, 3, 2023-01-28], [sports, 2, 2021-02-02].
现有尝试问题
未按证书类型分组,直接取整个证书列表的最新日期,导致仅筛选出该日期的证书,遗漏其他类型证书;同时输出格式不符合要求。
解决方案
方案1:按等级高低取最高(同类型优先取level最大的,level相同则取最新日期)
jq -r '.member[] | .firstName + " " + .lastName as $name | .certificates | group_by(.grade.type)[] | sort_by(.grade.level, .awardDate) | last | "[\(.grade.type), \(.grade.level), \(.awardDate)]" as $cert | reduce . as $_ ([]; . + [$cert]) | $name + ", " + (join(", ")) + "." ' members.json
逻辑说明
- 遍历每个成员,提取姓名存为
$name - 对成员的证书列表按
grade.type分组,得到同类型证书的子数组 - 每个子数组按
grade.level升序、再按awardDate升序排序,取最后一个即为该类型等级最高(或等级相同下最新)的证书 - 将符合条件的证书格式化为指定字符串,最后拼接姓名与证书列表生成最终输出
方案2:按最新获取日期取(同类型优先取awardDate最晚的,日期相同则取最高level)
jq -r '.member[] | .firstName + " " + .lastName as $name | .certificates | group_by(.grade.type)[] | sort_by(.awardDate, .grade.level) | last | "[\(.grade.type), \(.grade.level), \(.awardDate)]" as $cert | reduce . as $_ ([]; . + [$cert]) | $name + ", " + (join(", ")) + "." ' members.json
逻辑说明
- 前两步与方案1一致,提取姓名并按证书类型分组
- 每个子数组按
awardDate升序、再按grade.level升序排序,取最后一个即为该类型最新日期(或日期相同下等级最高)的证书 - 后续格式拼接逻辑与方案1相同
内容的提问来源于stack exchange,提问作者user3813400
相关产品推荐
相关产品推荐

