json出力をカンマ区切りの1行で印刷します。

json出力をカンマ区切りの1行で印刷します。

私はJQに最初に触れました、そして次のjsonファイルがあります:

   [
   {
     "userId" : "jens",
     "firstName" : "jens",
     "lastName" : "jens",
     "emailAddress" : "[email protected]",
     "source" : "default",
     "status" : "active",
     "readOnly" : false,
     "roles" : [ "reader" ],
     "externalRoles" : [ ]
   }, {
     "userId" : "admin",
     "firstName" : "Administrator",
     "lastName" : "User",
     "emailAddress" : "[email protected]",
     "source" : "default",
     "status" : "changepassword",
     "readOnly" : false,
     "roles" : [ "app-admin" ],
     "externalRoles" : [ ]
   }]  

今、私は次の形式を印刷したいと思います。

"userId" : "jens","roles" : [ "reader" ]
"userId" : "admin", "roles" : [ "app-admin" ],

この目標をどのように達成できますか?このコマンドを試してみました。

jq -r '.[].userId,.[].roles'

ただし、以下のようにデータが分散されます。

jens
admin
[]
[
  "reader",
  "app-admins",
]

上記の出力がどのように得られるかをご案内ください。

ベストアンサー1

そうすれば

jq -c '.[] | {userid: .userId, roles: .roles}'

あなたは得るでしょう

{"userid":"jens","roles":["reader"]}
{"userid":"admin","roles":["app-admin"]}

この-cフラグは各オブジェクトを独自の行に配置するため、入れ子になったオブジェクトがない限り、必要に応じて機能します。中括弧の削除などの後処理:

jq -c '.[] | {userid: .userId, roles: .roles}' | sed -e 's/^{//g' -e 's/}$//g'

生産する

"userid":"jens","roles":["reader"]
"userid":"admin","roles":["app-admin"]

おすすめ記事