다음과 유사한 (사전?) JSON 파일이 있습니다.
{
"Salad": {
"name": "Dressing",
"good": true,
"status": true
},
"Data_XML": {
"name": "XML",
"good": false
},
"Functionality": {
"name": "FUNC",
"good": true
},
"Data_JSON": {
"name": "JSON",
"good": true,
"status": false
}
}
다음과 같은 CSV 출력을 찾고 있습니다.
"title","good","name","status"
"Salad",true,"Dressing",true
"Data_XML",false,"XML",""
"Functionality",true,"FUNC",""
"Data_JSON",true,"JSON",false
무엇내가 찾았어제가 지금까지 사용해왔던 방법입니다..
jq -r '(map(keys_unsorted) | add | unique) as $cols | $cols, map(. as $row | $cols | map($row[.]))[] | @csv'
산출:
"good","name","status"
true,"Dressing",true
false,"XML",
true,"FUNC",
true,"JSON",false
나는 동등한 것이 필요하다샐러드, Data_XML, 함수 및 Data_JSON~처럼열 1(정렬되지 않음) 및 관련 데이터.
에 관해서는"좋음", "이름", "상태"이는 헤더 필드가 되며 무작위이므로 동적으로 검색해야 합니다(데이터 세트당 4개가 있을 수 있고 다른 데이터 세트에는 10개가 있을 수 있음). 이것은 상대적으로 큰 파일이고 "제목"을 첫 번째 열 헤더 항목으로 남겨두기 때문에 수동으로 구문 분석하기가 어렵습니다."제목", "좋음", "이름", "상태", "뭔가", "기타", "무작위", "기타"
너무 가까워진 것 같아요... 어떤 도움이라도 대단히 감사하겠습니다!
답변1
나는 이것이 효과가 있을 것이라고 생각합니다:
jq -r '["title","name","good","status"],(to_entries|.[]|
[.key,.value.good,.value.name,
(if .value.status == null then "" else .value.status end )]
)|@csv'
새 버전은 더욱 다양해졌습니다.
jq -r ' to_entries as $row |
( ( map(keys_unsorted ) | add | unique ) as $cols |
( ["title" , $cols] | flatten) ,
( $row | .[] as $onerow | $onerow |
( [ .key , ( $cols |
map ($onerow.value[.] as $v | if $v == null then "" else $v end ) ) ]
| flatten ) ) ) | @csv '