Объединить вывод jq в строку, разделенную запятыми

Объединить вывод jq в строку, разделенную запятыми

Я пытаюсь получить curlURL-адрес, который возвращает файл JSON, а затем хочу извлечь из него хосты и создать строку, разделенную запятыми.

У меня первая часть работает

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'

который возвращает

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

Теперь я хочу объединить их в одну строку, например

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

решение1

Сделайте это в jq, но посмотрите@Kusalananda's ответ первый

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

Нет, это неправильно. Вот что вам нужно:

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

Демонстрация:

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

выходы

one,two,three

решение2

pasteЛучший инструмент для выполнения этой работы:

your_command | paste -sd, -

решение3

Если вам нужен вывод в формате CSV из вашего документа JSON, то вы можете использовать оператор @csvв jq.

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

Это использует то же выражение, которое вы используете в вопросе, чтобы вытащить нужные вам данные, но оно помещает все имена хостов в массив. Затем массив передается, @csvчто гарантирует, что данные правильно заключены в кавычки для вывода CSV.

Вы ожидаете получить следующий результат:

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

Любые запятые, двойные кавычки или символы новой строки, встроенные в значения, будут правильно заключены в кавычки, как и ожидается в файле в формате CSV.

решение4

Если вы хотите использовать awk, просто напечатайте без newline:

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

Связанный контент