如何使用jq扁平化嵌套JSON,按指定格式输出Metrics条目?
问题描述
我有如下input.json文件(节选):
{ "Metrics": [ { "Namespace": "CWAgent", "MetricName": "disk_used_percent", "Dimensions": [ { "Name": "path", "Value": "/aem" }, { "Name": "host", "Value": "uat2-author01.uat.cloud.abc.com.au" }, { "Name": "device", "Value": "mapper/aem-aem" }, { "Name": "fstype", "Value": "ext4" } ] }, { "Namespace": "CWAgent", "MetricName": "mem_used_percent", "Dimensions": [ { "Name": "host", "Value": "uat2-dispatch02.uat.cloud.abc.com.au" } ] } ] }
可以看到Dimensions是长度可变的JSON对象列表。我需要将Metrics下的每个对象按如下格式输出为单行:
CWAgent|disk_used_percent|path:/aem|host:uat2-author01.uat.cloud.abc.com.au|device:mapper/aem-aem|fstype:ext4 CWAgent|mem_used_percent|host:uat2-dispatch02.uat.cloud.abc.com.au
我尝试了以下命令:
cat input.json | jq -r ".Metrics[] | .Namespace + \"|\" + .MetricName + \"|\" + (.Dimensions[] | .Name + \":\" + .Value + \"|\")"
得到的输出如下:
CWAgent|disk_used_percent|path:/aem| CWAgent|disk_used_percent|host:uat2-author01.uat.cloud.abc.com.au| CWAgent|disk_used_percent|device:mapper/aem-aem| CWAgent|disk_used_percent|fstype:ext4| CWAgent|mem_used_percent|host:uat2-dispatch02.uat.cloud.abc.com.au|
问题是第一个对象被拆成了4行,每行对应一个Dimensions元素,而且所有行末尾都有多余的|。求正确的jq命令。
解决方案
使用以下jq命令可以实现需求:
cat input.json | jq -r '.Metrics[] | [.Namespace, .MetricName] + (.Dimensions[] | .Name + ":" + .Value) | join("|")'
命令解释
- 遍历
Metrics数组中的每个对象:.Metrics[] - 把
Namespace、MetricName和处理后的Dimensions元素整合到同一个数组中:[.Namespace, .MetricName] + (.Dimensions[] | .Name + ":" + .Value)- 这里
(.Dimensions[] | .Name + ":" + .Value)会将每个维度转换为Name:Value格式的字符串,再和前两个字段组合成完整数组
- 这里
- 用
join("|")把数组元素用|连接成单行字符串,这种方式只会在元素间添加分隔符,避免了末尾多余的|
原命令出错原因
原命令直接将Dimensions[]的遍历结果与前面的字符串拼接,Dimensions[]会逐个输出维度,导致每个维度单独占一行,且每个维度后额外添加的|会保留在每行末尾。而通过数组收集所有字段再join的方式,能确保所有字段在同一行,且分隔符仅出现在元素之间。
内容的提问来源于stack exchange,提问作者Bijitesh Kundu
相关产品推荐
相关产品推荐

