求助:使用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 )
命令解释
- 转换键值对:
to_entries[]将JSON对象转换为键值对数组,方便遍历处理每个字段。 - 遍历分组:
reduce遍历每个键值对,初始化空对象作为结果容器:- 用
test("\\.\\d+$")判断字段名是否以.数字结尾; - 匹配成功时,通过
capture提取前缀(如aa.1的aa)和数字部分,将数字转为数值类型后,和字段值一起存入对应前缀的数组中; - 匹配失败时,直接将原字段存入结果容器。
- 用
- 排序拼接:
with_entries处理最终结果:- 对分组后的数组,按数字字段排序,提取值后用空格拼接成字符串;
- 非数组类型的字段保持原样。
内容的提问来源于stack exchange,提问作者Tamás Horváth
相关产品推荐
相关产品推荐

