이 데이터를 사용하면 다음과 같습니다.
[
{
"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