使用jq将嵌套的JSON展平并打印外部JSON:

huangapple go评论52阅读模式
英文:

Flattening a nested json while printing outer json using jq

问题

我有一个类似下面的文件(摘录)

cat 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的新手,已经在尝试中浪费了太多时间。

谢谢,
Bijitesh

英文:

I have a file like below (excerpt)

cat 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"
                }
            ]
        }
    ]
}

As you can see the "Dimensions" is a list of json objects of varying length. I am required to print each objects under "Metrics" in a single line like below -

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

I used this -

cat input.json | jq -r ".Metrics[] | .Namespace + \"|\" + .MetricName + \"|\" + (.Dimensions[] | .Name + \":\" + .Value + \"|\")"

And the output is like below:

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|

As you can see, we are getting 4 lines for first object each having different object under Dimensions. Can anyone please suggest what will be the jq command to get desired output. I am novice in jq and wasted too much time on this experimenting.

Thanks,
Bijitesh

答案1

得分: 0

以下是翻译好的部分:

jq -r '.Metrics[] | [.Namespace, .MetricName] + (.Dimensions | map("\(.Name):\(.Value)")) | join("|")' input.json
英文:

You're looking for this:

jq -r '.Metrics[] | [.Namespace, .MetricName] + (.Dimensions | map("\(.Name):\(.Value)")) | join("|")' input.json

huangapple
  • 本文由 发表于 2023年2月10日 10:21:47
  • 转载请务必保留本文链接:https://go.coder-hub.com/75406356.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定