jqを使用してTSVで平面化し、入れ子になった配列をコンマ区切り値で平面化するにはどうすればよいですか?

jqを使用してTSVで平面化し、入れ子になった配列をコンマ区切り値で平面化するにはどうすればよいですか?

次のJSON形式があります。

{
"page":1,
"total_results":1,
"total_pages":1,
"results":[
    {
    "id":6037,
    "genre_ids":[35,80,9648,53],
    "popularity":11.379
    }
]
}

Genre_ids配列はコンマで区切られ、水平間隔にタブを追加しないこの形式を生成する必要があります。

6037   35,80,9648,53   11.379

以下を使用して結果の配列を平面化することができました。

jq -r '.results[0] | [.id,.popularity] | @tsv'

結果:

6037   11.379

しかし、Genre_idsを追加すると:

jq -r '.results[0] | [.id,.genre_ids[],.popularity] | @tsv'

私は得る:

308531   28   12   35   878   10751   32.497

genre_idsタブ区切りの親要素内で配列をカンマ区切りリストにマージする方法は?

答え1

あなたはできますjoin配列を文字列に変換:

$ jq -r '.results[0] | [.id,(.genre_ids | join(",")),.popularity] | @tsv' < foo.json
6037    35,80,9648,53   11.379

答え2

jq -r '.results[] | [ .id, (.genre_ids|@csv), .popularity ] | @tsv' file

これにより、genre_ids配列がタブ区切りの出力の一部になる前にCSV形式のレコードに再フォーマットされます。

質問のデータを考慮すると、出力は次のようになります。

6037    35,80,9648,53   11.379

results配列に複数の要素が含まれる場合、各要素は独自の出力ラインで書式設定されます。

配列に多くの要素を提供する出力の例results:

$ cat file
{
   "page": 1,
   "results": [
      {
         "genre_ids": [ 3, 8, 964, 5 ],
         "id": 6000,
         "popularity": 12
      },
      {
         "genre_ids": [ 35, 80, 9648, 53 ],
         "id": 6037,
         "popularity": 11.379
      }
   ],
   "total_pages": 1,
   "total_results": 2
}
$ jq -r '.results[] | [ .id, (.genre_ids|@csv), .popularity ] | @tsv' file
6000    3,8,964,5       12
6037    35,80,9648,53   11.379

関連情報