Всякий раз, когда вам дается массив пар ключ / значение (теги здесь), и вы хотите извлечь значения по их ключу, вам будет проще отобразить их в объект, чтобы вы могли обращаться к ним напрямую. Функции вроде from_entries
будут хорошо работать с этим.
Однако, поскольку вы также пытаетесь получить значения, не входящие в этот массив тегов, вы можете подойти к нему немного по-другому, чтобы сохранить некоторые шаги. Используя reduce
или foreach
, вы можете пройти через каждый из тегов и добавить его к объекту, который содержит все интересующие вас значения. Затем вы можете отобразить нужные значения в массив, а затем преобразовать в CSV. строки.
Таким образом, если ваша цель - создать строки по Tags[Name], InstaceId, Tags[Client], Tags[CostCenter]
для каждого экземпляра, вы можете сделать это:
# for each instance
.Reservations[].Instances[]
# map each instance to an object where we can easily extract the values
| reduce .Tags[] as $t (
{ InstanceId }; # we want the InstanceId from the instance
.[$t.Key] = $t.Value # add the values to the object
)
# map the desired values to an array
| [ .Name, .InstanceId, .Client, .CostCenter ]
# convert to csv
| @csv
И хорошей новостью является то, что если Name
, Client
или CostCenter
не существует в массиве тегов или даже InstanceId
, то они просто будут null
, которые становятся пустыми, когда преобразован в CSV.