You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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("|")'

命令解释

  1. 遍历Metrics数组中的每个对象:.Metrics[]
  2. 把Namespace、MetricName和处理后的Dimensions元素整合到同一个数组中:[.Namespace, .MetricName] + (.Dimensions[] | .Name + ":" + .Value)
    • 这里(.Dimensions[] | .Name + ":" + .Value)会将每个维度转换为Name:Value格式的字符串,再和前两个字段组合成完整数组
  3. 用join("|")把数组元素用|连接成单行字符串,这种方式只会在元素间添加分隔符,避免了末尾多余的|

原命令出错原因

原命令直接将Dimensions[]的遍历结果与前面的字符串拼接,Dimensions[]会逐个输出维度,导致每个维度单独占一行,且每个维度后额外添加的|会保留在每行末尾。而通过数组收集所有字段再join的方式,能确保所有字段在同一行,且分隔符仅出现在元素之间。

内容的提问来源于stack exchange,提问作者Bijitesh Kundu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 07:45:37