JQ按字符串类型小数字段降序排序异常如何返回完整对象
问题原因
排序结果错误的核心原因是weight字段为字符串类型,jq默认对字符串执行字典序逐字符比较,不会自动解析为数值计算大小,因此会出现忽略小数点数值逻辑的排序结果。
你之前拆分小数点再转数字的方案属于冗余处理,直接对整个weight字段值调用tonumber做类型转换即可作为正确的排序键,不需要额外拆分字符串。之前的命令只能返回weight字段,是因为你用[.[].weight]提前丢弃了原对象的其他属性,只要在排序逻辑内做类型转换、不修改原数组元素结构,就能保留完整的对象属性。
可用命令
写法1:升序排序后反转得到降序结果
jq 'map(select(.weight)) | sort_by(.weight | tonumber) | reverse' 输入文件.json
命令逻辑说明:
map(select(.weight)):过滤掉不存在weight字段的无效条目sort_by(.weight | tonumber):以weight转为数值后的结果为键做升序排序reverse:将升序结果反转,得到weight从高到低的降序排列
写法2:排序键取负直接实现降序
jq 'map(select(.weight)) | sort_by(- (.weight | tonumber))' 输入文件.json
该写法直接对转换后的数值取负作为排序键,不需要额外反转步骤,排序效果和写法1完全一致。
排序结果
执行命令后返回的完整JSON对象顺序为:
- car,weight值
527561695272.42000000 - bike,weight值
9914795.00000000 - truck,weight值
999147.00000000 - plane,weight值
819002.68900000 - train,weight值
89129.70000000
所有对象的name、amount等原有属性都会完整保留,不会丢失。
内容的提问来源于stack exchange,提问作者divedivedive
相关产品推荐
相关产品推荐

