Fusionar la salida de jq en una cadena separada por comas

Fusionar la salida de jq en una cadena separada por comas

Estoy intentando acceder a curlalguna URL que devuelva un archivo json, luego quiero analizar los hosts y crear una cadena separada por comas.

ya tengo la primera parte funcionando

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'

que regresa

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

Ahora quiero unirlos en una sola cadena como

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

Respuesta1

Hazlo en jq, pero miraLa respuesta de @Kusalananda primero

jq -r '.host_components[].HostRoles.host_name | join(",")'

No eso está mal. Esto es lo que necesitas:

jq -r '.host_components | map(.HostRoles.host_name) | join(",")'

Manifestación:

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

salidas

one,two,three

Respuesta2

pastees la mejor herramienta para hacer este trabajo:

your_command | paste -sd, -

Respuesta3

Si lo que desea es una salida con formato CSV de su documento JSON, puede usar el @csvoperador en jq.

somecommand | jq -r '[ .host_components[].HostRoles.host_name ] | @csv'

Esto usa la misma expresión que estás usando en la pregunta para extraer los datos que deseas, pero coloca todos los nombres de host en una matriz. Luego se pasa la matriz, @csvlo que garantiza que los datos se citan correctamente para la salida CSV.

Esperaría obtener el siguiente resultado de esto:

"zk0-mycluster.net","zk1-mycluster.net","zk2-mycluster.net"

Cualquier coma, comilla doble o nueva línea incrustada en los valores se citará correctamente como se espera en un archivo con formato CSV.

Respuesta4

Si desea utilizar awk, simplemente imprima sin newline:

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

información relacionada