如何让JQ在输出中保留匹配记录间的逗号分隔?
解决JQ筛选结果无逗号分隔的问题
问题说明
我在Windows的cmder或标准命令提示符中,用命令行JSON工具JQ处理本地JSON文件,已经能筛选出符合条件的记录,但输出的结果里匹配的对象之间没有逗号分隔,不符合预期格式。
给定sample.json内容:
[{ "name": "Bob", "location": "New York" }, { "name": "Adam", "location": "Los Angeles" }, { "name": "Jill", "location": "Chicago" } ]
执行筛选命令:
jq ".[] | select((.location == \"New York\") or select(.location == \"Los Angeles\"))" sample.json
(Windows环境下,命令行里的双引号需要用\"转义)
得到的输出是:
{ "name": "Bob", "location": "New York" } { "name": "Adam", "location": "Los Angeles" }
我需要在不修改原文件的前提下,实现两种预期输出:
- 仅带逗号分隔的对象列表:
{ "name": "Bob", "location": "New York" }, { "name": "Adam", "location": "Los Angeles" }
- 完整的标准JSON数组格式:
[ { "name": "Bob", "location": "New York" }, { "name": "Adam", "location": "Los Angeles" } ]
解决方法
1. 输出完整JSON数组(推荐)
JQ用.[]会把原数组拆成单个对象输出,要保留数组结构并自动添加逗号,只需把整个筛选逻辑包裹在数组构造器[]中:
修改后的命令:
jq "[.[] | select(.location == \"New York\" or .location == \"Los Angeles\")]" sample.json
这个命令直接输出标准JSON数组,不管是命令行查看还是输出到文件都适用:
jq "[.[] | select(.location == \"New York\" or .location == \"Los Angeles\")]" sample.json > newsample.json
2. 仅输出带逗号分隔的对象(无外层数组)
如果不需要外层数组,只想让对象间用逗号分隔,可以通过两次JQ调用实现:
jq -r ".[] | select(.location == \"New York\" or .location == \"Los Angeles\") | tostring" sample.json | jq -s 'join(",\n")'
步骤解释:
- 第一次调用:用
-r输出原始字符串,tostring把每个筛选出的对象转成JSON字符串 - 第二次调用:用
-s把所有输入字符串合并成数组,再用join(",\n")添加逗号和换行分隔
简化筛选条件
原命令里的嵌套select是多余的,直接用or连接条件即可;如果是JQ 1.6及以上版本,还可以用IN函数让条件更简洁:
# 用IN简化的完整数组输出命令 jq "[.[] | select(.location IN (\"New York\", \"Los Angeles\"))]" sample.json
内容的提问来源于stack exchange,提问作者NewJackSwing4Ever
相关产品推荐
相关产品推荐

