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'

これは、必要なデータを抽出するために質問に使用されたのと同じ式を使用しますが、すべてのホスト名を配列に入れます。その後、この配列は@csvCSV出力でデータが正しく参照されていることを確認するために渡されます。

次のような結果が出ると予想されます。

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

値に含まれるすべてのカンマ、二重引用符、または改行は、CSV形式のファイルで期待どおりに正しく引用されます。

答え4

を使用するには、awknoを印刷してくださいnewline

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

関連情報