code

jq를 사용하여 요소 속성 값으로 개체 배열을 필터링하려면 어떻게 해야 합니까?

starcafe 2023. 2. 16. 21:56
반응형

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

반응형