jq를 사용하여 객체의 변수 값을 기준으로 객체를 선택하십시오.


236

다음 json 파일이 있습니다.

{
    "FOO": {
        "name": "Donald",
        "location": "Stockholm"
    },
    "BAR": {
        "name": "Walt",
        "location": "Stockholm"
    },
    "BAZ": {
        "name": "Jack",
        "location": "Whereever"
    }
}

jq를 사용하고 있으며 'location'이 'Stockholm'인 객체의 "name"요소를 가져오고 싶습니다.

나는 모든 이름을

cat json | jq .[] | jq ."name"
"Jack"
"Walt"
"Donald"

그러나 하위 키 (여기 "location" : "Stockholm") 의 값이 주어지면 특정 객체 만 인쇄하는 방법을 알 수 없습니다 .

답변:


341

jq로 JSON 처리 에 대한이 게시물에서 다음 select(bool)과 같이 사용할 수 있습니다 .

$ jq '.[] | select(.location=="Stockholm")' json
{
  "location": "Stockholm",
  "name": "Walt"
}
{
  "location": "Stockholm",
  "name": "Donald"
}

30
부모 'FOO', 'BAR', 'BAZ'는 어떻게 얻습니까?
spazm

184

이름의 스트림을 얻으려면 :

$ jq '.[] | select(.location=="Stockholm") | .name' json

생산 :

"Donald"
"Walt"

해당 (키 이름, "name"속성) 쌍의 스트림을 얻으려면 다음을 고려하십시오.

$ jq -c 'to_entries[]
        | select (.value.location == "Stockholm")
        | [.key, .value.name]' json

산출:

["FOO","Donald"]
["BAR","Walt"]

"위치 키를 기준으로 특정 개체 만 인쇄하는 방법을 알 수 없습니다"
Fo.

2
선택 후 파이프가 필요하지 않습니다. $ jq '. [] | select (.location == "Stockholm"). name 'json
Deepak

name키 변수를 만들 때 ( $1매개 변수로 쉘 함수 사용 ) 작동하지 않습니다 termux-contact-list |jq -r '.[] | select(.name=="$1")|.number'. 나는 그것을 이렇게 부른다 cool_fn Name1. 그러나 이것은 작동합니다 :termux-contact-list |jq -r '.[] | select(.name=="Name1")|.number'
Timo

여기에 당신이 변수를 좋아하는 경우에 솔루션입니다.
Timo

27

비슷한 관련 질문이 있습니다. 원래 객체 형식을 키 이름 (예 : FOO, BAR)으로 되돌리려면 어떻게해야합니까?

Jq는 객체와 키-값 쌍 배열을 제공 to_entries하고 from_entries변환합니다. map선택 주위 와 함께

이 함수는 객체와 키-값 쌍의 배열 사이를 변환합니다. to_entries에 오브젝트가 전달되면 입력의 각 k : v 항목에 대해 출력 배열에 { "key": k, "value": v}가 포함됩니다.

from_entries는 반대 변환을 수행하며 with_entries (foo)는 to_entries의 약어입니다. 지도 (foo) | from_entries는 객체의 모든 키와 값에 대한 작업을 수행하는 데 유용합니다. from_entries는 키, 키, 이름, 이름, 값 및 값을 키로 허용합니다.

jq15 < json 'to_entries | map(select(.value.location=="Stockholm")) | from_entries'

{
  "FOO": {
    "name": "Donald",
    "location": "Stockholm"
  },
  "BAR": {
    "name": "Walt",
    "location": "Stockholm"
  }
}

with_entries속기를 사용하면 다음 과 같습니다.

jq15 < json 'with_entries(select(.value.location=="Stockholm"))'
{
  "FOO": {
    "name": "Donald",
    "location": "Stockholm"
  },
  "BAR": {
    "name": "Walt",
    "location": "Stockholm"
  }
}

1
저를 물고 계속 한 것은 당신이 사용할 때 기억해야 할 것입니다 with_entries(), 당신은 일반적으로도 사용할 .valueselect절. 때문이다 to_entries매크로가 주어진 항목을 변환 .key.value도 함께 일 쌍 with_entries.
Jaakko
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.