jq 출력을 쉼표로 구분된 문자열로 병합

jq 출력을 쉼표로 구분된 문자열로 병합

json 파일을 반환하는 일부 URL을 시도 중입니다 curl. 그런 다음 해당 파일에서 호스트를 구문 분석하고 쉼표로 구분된 문자열을 만들고 싶습니다.

첫 번째 부분이 작동 중입니다.

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의 답변 첫 번째

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

원하는 것이 JSON 문서의 CSV 형식 출력인 @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}'

관련 정보