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

관련 정보