Jq --- 중첩된 json을 csv로 변환

Jq --- 중첩된 json을 csv로 변환

아래와 같은 샘플 JSON이 있습니다.

{
  "data": [
    {
      "name": "city",
      "LIST": {
        "ID": [
          {
            "value": "ny",
            "name": "US"
          },
          {
            "value": "lon",
            "name": "GB"
          },
          {
            "value": "Toronto",
            "name": "CA"
          }
        ]
      }
    },
    {
      "name": "city1"
    }
  ]
}

다음 값을 얻고 싶습니다

city,ny

city1,

나는 name="US" 의 값만 원합니다 jq.

배열의 각 요소의 최대값은 1 name="US" 입니다 data. ="US" 가 없으면 name비어 있거나 NULL이기를 원합니다. 위의 예에서 두 번째 레코드에 ="US"가 없으면 출력은 또는 이 name됩니다 .city1,blankcity1,

답변1

data요소 가 다음과 같다고 가정합니다.최대.LIST.ID배열의 한 요소 name는 다음과 같습니다 US.

jq -r <file '.data[] |
  [ .name, (.LIST.ID[] | select(.name == "US").value)? // null ] |
  @csv'

할 수 있는 작업:

  1. 배열의 모든 요소를 ​​반환(유지)합니다 data.
  2. 의 각 요소에 대해 다음을 data포함하는 2요소 배열(CSV 형식 지정에 필요)을 만듭니다.
    1. name각 요소 data의 속성값
    2. 와 같은 배열 요소의 속성 값 value(그렇지 않은 경우 in을 사용하여 완전히 비어 있는 필드 대신 CSV 출력에서 ​​큰따옴표로 묶인 필드를 가져올 수 있음) 완전히 누락되었습니다. 오류가 발생하지 않습니다..LIST.IDnameUSnull""null?.LIST.ID
  3. 결과 배열 목록을 CSV 데이터로 렌더링합니다.

답변2

본질적으로 동일프레이산의 대답.LIST.ID, 그러나 배열의 요소가 객체로 변환될 수 있다는 사실을 활용합니다. 여기서 name값은 키이고 value값은 해당 값입니다.

jq -r '.data[] | [.name, (.LIST.ID | from_entries? | .US) // "blank"] | @csv' file

주어진 예제 데이터를 입력으로 사용하면 다음과 같은 헤더 없는 CSV 데이터가 생성됩니다.

"city","ny"
"city1","blank"

데이터에서 두 번째 필드를 사용할 수 없는 경우 // "blank"표현식에서 로 변경하여 빈 필드를 생성합니다.// nulljq

관련 정보