jq를 사용하여 요소 속성 값으로 개체 배열을 필터링하려면 어떻게 해야 합니까?
jq를 사용하여 json 파일을 필터링하는 것을 좋아합니다.
jq . some.json
개체의 배열을 포함하는 json 지정:
{
"theList": [
{
"id": 1,
"name": "Horst"
},
{
"id": 2,
"name": "Fritz"
},
{
"id": 3,
"name": "Walter"
},
{
"id": 4,
"name": "Gerhart"
},
{
"id": 5,
"name": "Harmut"
}
]
}
이 목록을 필터링하여 값이 2와 4인 id의 요소만 표시하도록 합니다.따라서 예상되는 출력은 다음과 같습니다.
{
"id": 2,
"name": "Fritz"
},
{
"id": 4,
"name": "Gerhart"
}
jq를 사용하여 json을 필터링하려면 어떻게 해야 합니까?셀렉트와 지도를 가지고 놀았지만, 그 중 어느 것도 작동하지 않았습니다. 예를 들면 다음과 같습니다.
$ jq '.theList[] | select(.id == 2) or select(.id == 4)' array.json
true
문서에서:
jq '.[] | select(.id == "second")'
입력
[{"id": "first", "val": 1}, {"id": "second", "val": 2}]
산출량
{"id": "second", "val": 2}
다음과 같은 작업을 수행할 수 있습니다.
jq '.theList[] | select(.id == 2 or .id == 4)' array.json
사용할 수 있습니다.select
이내에map
.
.theList | map(select(.id == (2, 4)))
또는 보다 콤팩트하게:
[ .theList[] | select(.id == (2, 4)) ]
비교되는 모든 값에 대해 표현이 중복되기 때문에 다소 비효율적입니다.다음과 같이 쓰면 더 효율적이고 읽기 쉬울 수 있습니다.
[ .theList[] | select(any(2, 4; . == .id)) ]
사용.select(.id == (2, 4))
일반적으로 비효율적입니다(아래 참조).
당신의 jq가IN/1
보다 효율적인 솔루션을 실현하기 위해 사용할 수 있습니다.
.theList[] | select( .id | IN(2,3))
JQ에 다음 값이 없는 경우IN/1
그러면 다음과 같이 정의할 수 있습니다.
def IN(s): first(select(s == .)) // false;
효율성.
비효율성을 확인하는 한 가지 방법은debug
예를 들어, 다음 표현은 10개의 콜을 발생시킵니다.debug
단, 실제로 필요한 체크는 9개뿐입니다.
.theList[] | select( (.id == (2,3)) | debug )
["DEBUG:",false]
["DEBUG:",false]
["DEBUG:",true]
{
"id": 2,
"name": "Fritz"
}
["DEBUG:",false]
["DEBUG:",false]
["DEBUG:",true]
{
"id": 3,
"name": "Walter"
}
["DEBUG:",false]
["DEBUG:",false]
["DEBUG:",false]
["DEBUG:",false]
인덱스/1
원칙적으로,index/1
효율이 높아야 하지만, 본서(2017년 10월) 현재, 그 구현은 빠르지만(C로 작성) 비효율적이다.
인덱스를 사용한 솔루션은 다음과 같습니다.
.theList | [ .[map(.id)|indices(2,4)[]] ]
언급URL : https://stackoverflow.com/questions/38121740/how-to-filter-array-of-objects-by-element-property-values-using-jq
'code' 카테고리의 다른 글
'오류: [$parse:lexerr] 렉서 오류:heroku 전개 시 예기치 않은 다음 캐릭터' (0) | 2023.02.16 |
---|---|
각도 방향에서 부울 값을 바인딩하려면 어떻게 해야 합니까? (0) | 2023.02.16 |
Javascript를 사용한 CSS 값 변경 (0) | 2023.02.16 |
DESCRIBE 명령을 사용하지 않고 Oracle에서 테이블을 기술하려면 어떻게 해야 합니까? (0) | 2023.02.16 |
리액트 훅을 사용하여 다음 렌더링에 집중하는 방법 (0) | 2023.02.16 |