jq出力をカンマ区切りの文字列にマージする

jq出力をカンマ区切りの文字列にマージする

curljson ファイルを返す URLを試し、そこからホストを解析して、コンマ区切りの文字列を作成したいと考えています。

最初の部分は機能しています

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

これらを1つの文字列に結合したいのですが

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'

これは、質問で使用しているのと同じ式を使用して必要なデータを抽出しますが、すべてのホスト名を配列に格納します。その後、配列が渡され、@csvCSV 出力でデータが適切に引用符で囲まれるようになります。

これにより、次のような出力が得られることが期待されます。

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

値に埋め込まれたカンマ、二重引用符、または改行は、CSV 形式のファイルでは期待どおりに適切に引用符で囲まれます。

答え4

を使用したい場合はawk、 なしで印刷するだけですnewline:

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

関連情報