如何使用jq处理JSON对象并生成单行逗号分隔输出?
解决你的jq相关问题
嘿,我完全懂这种“以为操作超简单结果卡壳”的感觉,咱来一步步解决这两个jq问题:
问题1:合并两个对象并输出单行逗号分隔的结果
这里分两种常见场景,我都给你具体解法:
场景A:合并两个对象后,提取所有值并以逗号分隔输出
比如你有两个输入对象:
{"name": "Alice", "age": 30} {"city": "New York", "job": "Engineer"}
想要合并后得到值的逗号分隔结果:Alice,30,New York,Engineer
可以用这条命令:
jq -n 'input + input | [.[]] | join(",")'
解释一下:
-n:让jq从空输入开始,手动读取输入的对象input + input:把两个输入对象合并成一个新对象[.[]]:把合并后对象的所有值提取出来放到数组里join(","):把数组元素用逗号连接成单行字符串
场景B:合并两个对象后,输出键=值格式的逗号分隔结果
如果想要得到name=Alice,age=30,city=New York,job=Engineer这样的结果,用这条命令:
jq -n 'input + input | to_entries | map("\(.key)=\(.value)") | join(",")'
解释:
to_entries:把对象转成{"key": "...", "value": "..."}的数组map("\(.key)=\(.value)"):把每个条目转成键=值的字符串- 最后用
join(",")连接成单行
问题2:处理两个{ "foo": "bar" }和{ "foo": "baz" },得到bar,baz
这个有两种简单的写法,任选其一就行:
方法1:用-s选项把输入转成数组处理
jq -s 'map(.foo) | join(",")'
解释:
-s(--slurp):把所有输入的JSON对象合并成一个数组,也就是变成[{"foo":"bar"}, {"foo":"baz"}]map(.foo):提取数组中每个对象的foo值,得到["bar", "baz"]join(","):把数组转成逗号分隔的单行字符串
方法2:手动读取两次输入
jq -n '"\(input.foo),\(input.foo)"'
解释:
-n:从空输入开始,input每次读取一个JSON对象"\(input.foo),\(input.foo)":分别读取两个对象的foo值,拼接成逗号分隔的字符串
两种方法都能得到你想要的bar,baz结果~
内容的提问来源于stack exchange,提问作者mellow-yellow
相关产品推荐
相关产品推荐

