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

求助:使用jq按字段名前缀分组拼接JSON字段的实现方案

用jq处理带数字后缀的JSON字段分组拼接

需求描述

需要将JSON中所有以.数字结尾的字段按前缀分组,将对应字段值按数字顺序拼接为字符串;保留其他原有字段,同时移除原带后缀的字段。

输入示例

{
   "any": [], "other": 1,
   "aa.2": "second.", "aa.1": "first ",
   "bla.bla.0": "aa", "bla.bla.2": "bb"
}

期望输出

{
   "any": [], "other": 1,
   "aa": "first second.",
   "bla.bla": "aabb"
}

解决方案

使用以下jq命令即可实现需求:

reduce to_entries[] as $e ({};
  if $e.key | test("\\.\\d+$") then
    ($e.key | capture("^(?<prefix>.*)\\.(?<num>\\d+)$")) as $p
    | .[$p.prefix] += [{num: ($p.num | tonumber), val: $e.value}]
  else
    .[$e.key] = $e.value
  end
)
| with_entries(
  if .value | type == "array" then
    .value = (.value | sort_by(.num) | map(.val) | join(" "))
  else
    .
  end
)

命令解释

  1. 转换键值对:to_entries[]将JSON对象转换为键值对数组,方便遍历处理每个字段。
  2. 遍历分组:reduce遍历每个键值对,初始化空对象作为结果容器:
    • 用test("\\.\\d+$")判断字段名是否以.数字结尾;
    • 匹配成功时,通过capture提取前缀(如aa.1的aa)和数字部分,将数字转为数值类型后,和字段值一起存入对应前缀的数组中;
    • 匹配失败时,直接将原字段存入结果容器。
  3. 排序拼接:with_entries处理最终结果:
    • 对分组后的数组,按数字字段排序,提取值后用空格拼接成字符串;
    • 非数组类型的字段保持原样。

内容的提问来源于stack exchange,提问作者Tamás Horváth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 17:37:40