jq를 사용하여 객체 목록에서 필드와 하위 필드를 추출하고 하위 필드 쌍을 그룹화하여 csv에 저장합니다.

jq를 사용하여 객체 목록에서 필드와 하위 필드를 추출하고 하위 필드 쌍을 그룹화하여 csv에 저장합니다.

이 데이터를 사용하면 다음과 같습니다.

[
  {
    "c": "A",
    "e": "B",
    "score": 0.99,
    "v": [
      {
        "context": "asdf",
        "score": 0.98,
        "url": "..."
      },
      {
        "context": "bcdfd",
        "score": 0.97,
        "url": "..."
      }
    ]
  },
  { 
    ...
  }
]

(외부 목록 참고)

다음을 추출하려고 합니다.

A, B, 0.99, asdf, 0.98, bcdfd, 0.97

그러니 내가 할 수 있는 최선은

jq -r '.[] | [.c, .e, .score, .v[].context, .v[].score ] | @csv' 

이는

A, B, 0.99, asdf, bcdfd, 0.998, 0.97

나는 각각의 가치관을 알고 엮는 대신 그냥 뱉어낸다 .v[].context..v[score]

내가 놓치고 있는 마법은 무엇인가?

답변1

.context,.score내가 생각하는 각 요소에 대해 필터를 실행하고 싶습니다 v.

$ jq -r '.[] | [.c, .e, .score, (.v[] | .context,.score)] | @csv' file.json
"A","B",0.99,"asdf",0.98,"bcdfd",0.97

map이는 결과를 다시 배열로 모으지 않고 내장 함수를 사용하는 것과 같습니다 .

답변2

다음은 각 최상위 배열 요소에 대해 JSON으로 인코딩된 CSV 레코드를 생성한 후 이를 추출하고 디코딩합니다. 각 최상위 요소에 대해 하위 배열 값은 배열을 "평탄화"하여 결합됩니다.

jq -r 'map([ .c,.e,.score, (.v|map([.context, .score])) ] | flatten | @csv)[]' file

다음과 동일한 테스트 문서가 제공됩니다.

[
   {
      "c": "A",
      "e": "B",
      "score": 0.99,
      "v": [
         { "context": "asdf", "score": 0.98, "url": "..." },
         { "context": "bcdfd", "score": 0.97, "url": "..." }
      ]
   },
   {
      "c": "A",
      "e": "B",
      "score": 0.99,
      "v": [
         { "context": "asdf", "score": 0.98, "url": "..." },
         { "context": "asdf", "score": 0.98, "url": "..." },
         { "context": "bcdfd", "score": 0.97, "url": "..." }
      ]
   },
   {
      "c": "A",
      "e": "B",
      "score": 0.99,
      "v": [
         { "context": "asdf", "score": 0.98, "url": "..." },
         { "context": "asdf", "score": 0.98, "url": "..." },
         { "context": "asdf", "score": 0.98, "url": "..." },
         { "context": "bcdfd", "score": 0.97, "url": "..." }
      ]
   }
]

...우리는 얻었습니다

"A","B",0.99,"asdf",0.98,"bcdfd",0.97
"A","B",0.99,"asdf",0.98,"asdf",0.98,"bcdfd",0.97
"A","B",0.99,"asdf",0.98,"asdf",0.98,"asdf",0.98,"bcdfd",0.97

@csv또한 연산자를 한 번 사용하여 배열 집합을 얻도록( @csv단일 배열에서 재사용하지 않고) 작업 순서를 변경할 수도 있습니다 .

jq -r 'map([ .c,.e,.score, (.v|map([.context, .score])) ] | flatten)[]|@csv' file

관련 정보