如何使用jq将多行JSON转为数组并按指定键值排序?
jq实现逐行JSON转数组并按指定键排序
前置场景
现有input.log文件,逐行存储独立JSON对象,内容如下:
{"foo": "1", "foo2": "2"} {"foo": "3", "foo2": "4"} {"foo": "5", "foo2": "6"} {"foo": "7", "foo2": "8"}
需要使用jq完成两个处理:
- 将多个独立JSON对象合并为一个JSON数组
- 以公共键
foo的值为依据对数组元素排序
实现命令
基础版(按字符串规则排序)
直接用jq的slurp模式读取所有输入为数组,再调用排序函数即可:
jq -s 'sort_by(.foo)' input.log
参数说明:
-s:即slurp模式,自动将输入流中所有独立JSON条目读取后组装为单个数组,无需手动拼接sort_by(.foo):遍历数组元素,取每个元素的foo字段值作为排序键,执行升序排序
数值排序版(避免字符串排序逻辑误差)
如果foo存储的是数字字符串,直接按字符串排序会出现"10"排在"2"前面的问题,此时需要先将字段值转为数值类型再排序:
jq -s 'sort_by(.foo | tonumber)' input.log
如果需要降序排列,在排序逻辑后追加reverse即可:
jq -s 'sort_by(.foo | tonumber) | reverse' input.log
示例执行结果
针对给出的示例文件,执行上述排序命令后输出如下:
[ {"foo": "1", "foo2": "2"}, {"foo": "3", "foo2": "4"}, {"foo": "5", "foo2": "6"}, {"foo": "7", "foo2": "8"} ]
内容的提问来源于stack exchange,提问作者Pavarine
相关产品推荐
相关产品推荐

