Rad4
Rad4

Reputation: 2374

Convery yaml array to string array

I have a yq read command as below,

groups=$(yq read  generated/identity-mapping.yaml "iamIdentityMappings.[0].groups")

It reads iamIdentityMappings from below yaml:

iamIdentityMappings:
- groups:
  - Appdeployer
  - Moregroups

It stores group as below,

- Appdeployer
- Moregroups

But I want to store groups as below.(comma separated values)

groups="Appdeployer","Moregroups"

How to do this in bash?

Upvotes: 2

Views: 6547

Answers (4)

Mike Farah
Mike Farah

Reputation: 2564

yq 4.16+ now has a built in @csv operator:

yq e '.iamIdentityMappings.[0].groups | @csv' file.yaml

Note that @csv will only wrap values in quotes if needed (e.g. they have a comma).

If you want quotes, then sub then in and join with commas:

yq e '
   .iamIdentityMappings.[0].groups | 
   (.[] |= sub("(.*)", "\"${1}\"")) 
   | join(",")'

Disclaimer: I wrote yq.

Upvotes: 2

mbr1411
mbr1411

Reputation: 1

yq version 3 is deprecated now and you can achieve the same output using version 4

#!/bin/bash

while IFS= read -r value; do
    groups_array+=($value)
done < <(yq eval '.iamIdentityMappings.[0].groups.[]' generated/identity-mapping.yaml)

printf -v comma_seperated '%s,' "${groups_array[@]}"
echo "${comma_seperated%,}"

This code prints the comma seperated values as you wanted

Upvotes: 0

L&#233;a Gris
L&#233;a Gris

Reputation: 19545

Use mapfile and format a null delimited list with yq:

mapfile -d '' -t groups < <(
  yq -j '.iamIdentityMappings[0].groups[]+"\u0000"' \
  generated/identity-mapping.yaml
)
typeset -p groups

Output:

declare -a groups=([0]="Appdeployer" [1]="Moregroups")

And now you can fulfill this second part of your question: Construct a command based upon a count variable in bash

# Prepare eksctl's arguments into an array
declare -a eksctl_args=(create iamidentitymapping --cluster "$name" --region "$region" --arn "$rolearn" )

# Read the groups from the yml into an array
mapfile -d '' -t groups < <(
  yq -j '.iamIdentityMappings[0].groups[]+"\u0000"' \
  generated/identity-mapping.yaml
)

# Add arguments per group
for group in "${groups[@]}"; do
  eksctl_args+=(--group "$group")
done

# add username argument
eksctl_args+=(--username "$username")

# call eksctl with its arguments
eksctl "${eksctl_args[@]}"

Upvotes: 1

Shawn
Shawn

Reputation: 52334

yq is just a wrapper for jq, which supports CSV output:

$ groups="$(yq -r '.iamIdentifyMappings[0].groups | @csv' generated/identity-mapping.yaml)"
$ echo "$groups"
"Appdeployer","Moregroups"

The yq invocation in your question just causes an error. Note the fixed version.

Upvotes: 3

Related Questions