2016-04-27 45 views
0

我需要遍历(AWS实例ID的数组)的数组,然后将标签拉出并使用jq将它们添加到数组中。jq - in for loop,创建一个新数组,然后添加键/值对

我有变量定义我的需求。在这种情况下:

VolumeId 
Tag1Value 
Tag2Value 
Tag3Value 

它们随着我在for循环中迭代而改变。我知道如何创建一个新的阵列:

jq -n --arg v "$VolumeId" '[{"VolumeId": $v}]' 

但是,这会每次创建一个新的JSON数组。我需要创建一次,然后在循环中进行追加。

我找的输出是一个新创建的JSON数组:

[ 
    { 
    "VolumeId": $VolumeId, 
    "Tag1": $Tag1Value, 
    "Tag2": $Tag2Value, 
    "Tag3": $Tag3Value 
    }, 
    { 
    "VolumeId": $VolumeId, 
    "Tag1": $Tag1Value, 
    "Tag2": $Tag2Value, 
    "Tag3": $Tag3Value 
    }, 
    { 
    "VolumeId": $VolumeId, 
    "Tag1": $Tag1Value, 
    "Tag2": $Tag2Value, 
    "Tag3": $Tag3Value 
    } 
] 

任何帮助非常感谢。

回答

1

这里是示出如何值的流(这里,阵列的流)可被组合成一个JSON数组对象的示例:

(cat << EOF 
["VolumeId1", "Tag1Value1", "Tag2Value1", "Tag3Value1"] 
["VolumeId2", "Tag1Value2", "Tag2Value2", "Tag3Value2"] 
["VolumeId3", "Tag1Value3", "Tag2Value3", "Tag3Value3"] 
EOF 
) | jq -s 'map({VolumeId: .[0], Tag1Value: .[1], Tag2Value: .[2], Tag3Value: .[3] }) ' 

输出:

[ 
    { 
    "VolumeId": "VolumeId1", 
    "Tag1Value": "Tag1Value1", 
    "Tag2Value": "Tag2Value1", 
    "Tag3Value": "Tag3Value1" 
    }, 
    { 
    "VolumeId": "VolumeId2", 
    "Tag1Value": "Tag1Value2", 
    "Tag2Value": "Tag2Value2", 
    "Tag3Value": "Tag3Value2" 
    }, 
    { 
    "VolumeId": "VolumeId3", 
    "Tag1Value": "Tag1Value3", 
    "Tag2Value": "Tag2Value3", 
    "Tag3Value": "Tag3Value3" 
    } 
] 
+0

由于@peak ,它的工作原理,但有一个问题。当我遍历一个for循环时...我每次都得到新的数组。任何方式来使它1阵列? – user6127511

+0

这个想法是将整个“for”循环的输出传递给jq。沿着(for ...; do ... done)的路线行进jq -s ... – peak

+0

另外(并且对于不清楚我的原始问题表示歉意),我需要将新数组分配给一个变量,以便稍后将其与另一个数组合并。 '| new_array = $(jq -s'map({VolumeId:。[0] ....'不起作用 – user6127511