如何使用jq从json doc中提取连接的数据行

时间:2017-05-20 02:15:20

标签: json csv jq

我有一个类似的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"
                }
            }
        ]
    }
]

}

我使用了follwoing jq命令获取输出,如: AMI-111 | ETL-DB |可用|弹簧-AAA |大小AAA AMI-111 | ETL-DB |可用|管理单元BBB |尺寸-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

谢谢!

1 个答案:

答案 0 :(得分: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