![JSON 파싱: 조건부로 키 추출, 비어 있는 경우 다른 키로 대체](https://linux55.com/image/212189/JSON%20%ED%8C%8C%EC%8B%B1%3A%20%EC%A1%B0%EA%B1%B4%EB%B6%80%EB%A1%9C%20%ED%82%A4%20%EC%B6%94%EC%B6%9C%2C%20%EB%B9%84%EC%96%B4%20%EC%9E%88%EB%8A%94%20%EA%B2%BD%EC%9A%B0%20%EB%8B%A4%EB%A5%B8%20%ED%82%A4%EB%A1%9C%20%EB%8C%80%EC%B2%B4.png)
저는 JSON이고 jq
.
다음 JSON 문서가 있습니다.
{
"initial": [
{
"HIGH": null,
"LOW": "XXX",
"LARGE": "yyy",
"variant": "MAIN"
},
{
"HIGH": "ACE",
"LOW": "XXX",
"LARGE": "yyy",
"variant": "Loren"
}
]
}
내 코드:
jq -r '.initial[] | {Rank: .HIGH, Name: .variant} | join(",")'
산출:
,MAIN
ACE,Loren
예상 출력:
yyy,MAIN
ACE, Loren
그렇다면 HIGH
로 null
돌아가고 LARGE
, 그렇다면 null
로 돌아가십시오 LOW
.
또한 그렇다면 variant
기본값 null
을 사용하십시오 MAIN
.
누구든지 나를 도와줄 수 있나요?
내가 시도한 일부 튜토리얼에서:
jq -r '.initial[] | {Rank: (map(if (.HIGH == null or .HIGH == "null" or .HIGH == "") then .LARGE else .HIGH end)), Name: .variant}'
하지만 이로 인해 오류가 발생했습니다.
jq: error (at <stdin>:16): Cannot index string with string "HIGH"
답변1
당신이 원하는//
jq '.initial[] | [.HIGH // .LARGE // .LOW, .variant // "MAIN"] | join(",")'
답변2
출력하려는 것이 헤더가 있는 CSV 레코드 세트인 경우 헤더를 먼저 전달한 다음 연산자를 통해 데이터를 전달하여 얻을 수 있습니다 @csv
.
$ jq -r '[ "Rank", "Name" ], (.initial | map([.HIGH // .LARGE // .LOW, .variant // "MAIN"]))[] | @csv' file
"Rank","Name"
"yyy","MAIN"
"ACE","Loren"
이는 Glenn이 데이터를 추출하는 데 사용하는 것과 유사한 표현을 사용합니다.그들의 대답에, 그러나 사용하십시오 map()
(왜냐하면 나는 그것을 좋아 map()
하고 당신은 그것을 당신의 시도에 사용하고 싶어하는 것 같기 때문입니다).