Mesclar a saída jq em uma string separada por vírgula

Mesclar a saída jq em uma string separada por vírgula

Estou tentando curlalgum URL que retorne um arquivo json, então quero analisar hosts dele e criar uma string separada por vírgula.

Eu tenho a primeira 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 retorna

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

Agora quero juntá-los em uma string como

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

Responder1

Faça isso em jq, mas vejaResposta de @Kusalananda primeiro

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

Não, isto está errado. Isto é o que você precisa:

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

Demonstração:

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

saídas

one,two,three

Responder2

pasteé a melhor ferramenta para fazer este trabalho:

your_command | paste -sd, -

Responder3

Se o que você deseja é uma saída no formato CSV do seu documento JSON, você pode usar o @csvoperador em jq.

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

Isso usa a mesma expressão que você está usando na pergunta para extrair os dados desejados, mas coloca todos os nomes de host em uma matriz. A matriz é então passada, @csvgarantindo que os dados sejam citados corretamente para saída CSV.

Você esperaria obter o seguinte resultado disso:

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

Quaisquer vírgulas, aspas duplas ou novas linhas incorporadas nos valores seriam citadas corretamente conforme esperado em um arquivo no formato CSV.

Responder4

Se quiser usar awk, basta imprimir sem newline:

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

informação relacionada