使用 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

相关内容