web-dev-qa-db-fra.com

Fusionner la sortie jq dans une chaîne séparée par des virgules

J'essaie de curl une URL qui renvoie un fichier json, puis je veux en analyser les hôtes et créer une chaîne séparée par des virgules.

Je travaille la première partie

curl -s -u "admin:admin" -H "X-Requested-By: ambari" "https://hbasecluster.net/api/v1/clusters/mycluster/services/ZOOKEEPER/components/ZOOKEEPER_SERVER" | jq -r '.Host_components[].HostRoles.Host_name'

qui revient

zk0-mycluster.net
zk1-mycluster.net
zk2-mycluster.net

Maintenant, je veux les joindre en une seule chaîne comme

zk0-mycluster.net,zk1-mycluster.net,zk2-mycluster.net
18
roy

Faites-le dans jq

jq -r '.Host_components[].HostRoles.Host_name | join(",")'

Non c'est faux. Voici ce dont vous avez besoin:

jq -r '.Host_components | map(.HostRoles.Host_name) | join(",")'

Démo:

jq -r '.Host_components | map(.HostRoles.Host_name) | join(",")' <<DATA
{"Host_components":[
  {"HostRoles":{"Host_name":"one"}},
  {"HostRoles":{"Host_name":"two"}},
  {"HostRoles":{"Host_name":"three"}}
]}
DATA

les sorties

one,two,three
45
glenn jackman

paste est le meilleur outil pour faire ce travail:

your_command | paste -sd, -
11
cuonglm

Si vous souhaitez utiliser awk, imprimez simplement sans newline:

    <your command> | awk 'NR > 1 { printf(",") } {printf "%s",$0}'
2
Echoes_86