【问题标题】:How to use jq to extract joined rows of data from a json doc如何使用 jq 从 json doc 中提取连接的数据行
【发布时间】:2017-05-20 02:15:19
【问题描述】:

我有一个 JSON 文档,如下所示:

{
"Images": [
    {
        "ImageId": "ami-111",
        "Name": "etl-db",
        "State": "available",
        "BlockDeviceMappings": [
            {
                "DeviceName": "/dev/sda",
                "Ebs": {
                    "SnapshotId": "snap-AAA",
                    "VolumeSize": "size-AAA"
                }
            },
            {
                "DeviceName": "/dev/sdb",
                "Ebs": {
                    "SnapshotId": "snap-BBB",
                    "VolumeSize": "size-BBB"
                }
            }
        ]
    }
]

}

我使用以下 jq 命令 tr 来获取如下输出: ami-111|etl-db|可用|snap-AAA|size-AAA ami-111|etl-db|可用|snap-BBB|size-BBB

cat json.doc | jq -r '.Images[]|"\(.ImageId)|\(.Name)|\(.State)|\(.BlockDeviceMappings[].Ebs.SnapshotId)|\(.BlockDeviceMappings[].Ebs.VolumeSize)"'

但是它会为 SnapshotId x VolumeSize 生成笛卡尔积

ami-111|etl-db|available|snap-AAA|size-AAA
ami-111|etl-db|available|snap-BBB|size-AAA
ami-111|etl-db|available|snap-AAA|size-BBB
ami-111|etl-db|available|snap-BBB|size-BBB

我怎样才能得到以下输出?

ami-111|etl-db|available|snap-AAA|size-AAA
ami-111|etl-db|available|snap-BBB|size-BBB

谢谢!

【问题讨论】:

    标签: json csv jq


    【解决方案1】:

    为避免不需要的笛卡尔积,请确保只有一次调用 .BlockDeviceMappings[]

    以下过滤器将您想要的信息提取为数组流:

       .Images[] | [.ImageId,.Name,.State] + (.BlockDeviceMappings[] | [.Ebs[] ]) 
    

    (在上面,[.Ebs[]] 生成一个包含.Ebs 值的数组,这可能是也可能不是您想要的。)

    要将这些数组转换为具有管道分隔值的字符串,您可以将上述内容通过管道传递到join("|")@tsv | gsub("\t";"|") 以生成(使用jq -r):

    ami-111|etl-db|available|snap-AAA|size-AAA
    ami-111|etl-db|available|snap-BBB|size-BBB
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多