如何用JQ提取多键值并生成无引号的单行格式化输出?
解决jq输出无引号逗号分隔文本的问题
问题背景
你有这样的JSON输入:
[ { "Header": { "Tenant": "Test-d1", "Stage": "dev", "ProductType": "b2b", "Rcode": 401 }, "Body": { "error": { "code": 401, "message": "Unsupported authorization scheme" } } }, { "Header": { "Tenant": "2734d7ac0f0e", "Stage": "unknown", "ProductType": "unknown", "Rcode": 404 }, "Body": { "error": { "code": 404, "message": "Not found" } } } ]
想要提取指定字段值,输出成无引号的逗号分隔格式:
Test-d1, dev, b2b, Unsupported authorization scheme, 401 2734d7ac0f0e, unknown, unknown, Not found, 404
之前用jq -r .[] | [ .Header.Tenant, .Header.Stage, .Header.ProductType, .Body.error.message, .Body.error.code ] | @csv会自动给值加双引号,不符合需求。
解决方案
用join(", ")替代@csv即可实现无引号的直接拼接,对应的jq命令如下:
jq -r '.[] | [.Header.Tenant, .Header.Stage, .Header.ProductType, .Body.error.message, .Body.error.code] | join(", ")'
如果需要严格无空格的逗号分隔(比如Test-d1,dev,b2b,...),把join(", ")改成join(",")就行。
原理说明
@csv是jq专门用于生成符合CSV规范的输出,会自动给包含逗号、空格等特殊字符的字段添加双引号;而join(sep)是简单地将数组中的每个元素用指定分隔符连接,不会添加任何额外的引号,完全满足你要的无引号输出需求。
内容的提问来源于stack exchange,提问作者Invisible999
相关产品推荐
相关产品推荐

