You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

逻辑说明

  1. 遍历每个成员,提取姓名存为$name
  2. 对成员的证书列表按grade.type分组,得到同类型证书的子数组
  3. 每个子数组按grade.level升序、再按awardDate升序排序,取最后一个即为该类型等级最高(或等级相同下最新)的证书
  4. 将符合条件的证书格式化为指定字符串,最后拼接姓名与证书列表生成最终输出

方案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. 前两步与方案1一致,提取姓名并按证书类型分组
  2. 每个子数组按awardDate升序、再按grade.level升序排序,取最后一个即为该类型最新日期(或日期相同下等级最高)的证书
  3. 后续格式拼接逻辑与方案1相同

内容的提问来源于stack exchange,提问作者user3813400

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 11:43:19