我有一个类似的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
谢谢!
答案 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