2016-07-15 68 views
0

我想通过通过标签[]选择这JSON outputJQ过滤器包括unfound选择

标记过滤,如果存在键显示所选择的值。

我的JQ过滤器看起来是这样的:

jq -r ".Reservations[] 
| [.OwnerId, 
    .Instances[].InstanceId, 
    .Instances[].Placement.AvailabilityZone, 
    (.Instances[].Tags[]?|select(.Key==OtherTag)|.Value), 
    (.Instances[].Tags[]?|select(.Key==Name)|.Value) ] 
| @csv" 

输出看起来像这样

"xxxxxxxxxx9,i-d414ce0b,ap-southeast-2b,webserver2" 

我想它包括毫无根据选择的标签,并在CSV填充它作为空场 象下面这样:

"xxxxxxxxxx9,i-d414ce0b,ap-southeast-2b,,webserver2" 

我应该在JQ如何实现呢?有人能给我一个例子吗?

+0

所以我在这里做了一点进步的解决方案。通过使用地图和选择。 '。保留[] | [.OwnerId,.Instances []。InstanceId,.Instances []。Placement.AvailabilityZone,(.Instances []。Tags | map(if(select(.Key ==“Name”))then .Value else“”end )),(.Instances []。Tags | map(if(select(.Key ==“OtherTag”)).Value else“”end))]'但是我现在结果为空数组[ 。无论如何将空数组转换为空值?基本上压缩该数组的所有值到一个字符串?希望这是有道理的 – hutanrimba

回答

0

而不是使用select/1的,使用filter/1,其中:

def filter(f): if f then . else "" end; 
0

下面是使用from_entries处理.Tags

.Reservations[] 
| .OwnerId as $owner 
| .Instances[] 
| .InstanceId as $id  
| .Placement.AvailabilityZone as $az 
| .Tags 
| from_entries 
| "\($owner),\($id),\($az),\(.OtherTag//""),\(.Name//"")"