아래와 같은 샘플 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,blank
city1,
답변1
각 data
요소 가 다음과 같다고 가정합니다.최대.LIST.ID
배열의 한 요소 name
는 다음과 같습니다 US
.
jq -r <file '.data[] |
[ .name, (.LIST.ID[] | select(.name == "US").value)? // null ] |
@csv'
할 수 있는 작업:
- 배열의 모든 요소를 반환(유지)합니다
data
. - 의 각 요소에 대해 다음을
data
포함하는 2요소 배열(CSV 형식 지정에 필요)을 만듭니다.name
각 요소data
의 속성값- 와 같은 배열 요소의 속성 값
value
(그렇지 않은 경우 in을 사용하여 완전히 비어 있는 필드 대신 CSV 출력에서 큰따옴표로 묶인 필드를 가져올 수 있음) 완전히 누락되었습니다. 오류가 발생하지 않습니다..LIST.ID
name
US
null
""
null
?
.LIST
.ID
- 결과 배열 목록을 CSV 데이터로 렌더링합니다.
답변2
본질적으로 동일프레이산의 대답.LIST.ID
, 그러나 배열의 요소가 객체로 변환될 수 있다는 사실을 활용합니다. 여기서 name
값은 키이고 value
값은 해당 값입니다.
jq -r '.data[] | [.name, (.LIST.ID | from_entries? | .US) // "blank"] | @csv' file
주어진 예제 데이터를 입력으로 사용하면 다음과 같은 헤더 없는 CSV 데이터가 생성됩니다.
"city","ny"
"city1","blank"
데이터에서 두 번째 필드를 사용할 수 없는 경우 // "blank"
표현식에서 로 변경하여 빈 필드를 생성합니다.// null
jq