jq를 사용하여 특정 키와 해당 상위 키의 값을 가져옵니다.

jq를 사용하여 특정 키와 해당 상위 키의 값을 가져옵니다.

다음과 같은 JSON 개체가 있습니다.

{
  "1": {
    "available_memory": 1086419656.0,
    "available_memory_no_overbooking": 1086419656.0,
    "conns": 1.0
  },
  "2": {
    "available_memory": 108641236.0,
    "available_memory_no_overbooking": 10861216.0,
    "conns": 2.0
  }
}

각 개체 ID에 대한 "conns" 속성 값을 검색하고 싶습니다. 저는 jq를 처음 접했는데 명확한 예를 찾을 수 없습니다.

나는 다음을 시도했습니다 :

echo "$OUTPUT" | jq -r .[].conns

conns의 모든 값을 반환하지만 그것은 내가 필요한 것이 아닙니다. 예상되는 출력은 다음과 같습니다.

1 1.0
2 2.0

어떤 아이디어가 있나요?

답변1

$ jq -r 'keys[] as $k | "\($k) \(.[$k].conns)"' file.json
1 1
2 2

jq는 1.0을 1로, 2.0을 2로 변환하는 것 같습니다. 명확성을 위해 입력을 변경합니다.

$ cat file.json
{
  "1a": {
    "available_memory": 1086419656.0,
    "available_memory_no_overbooking": 1086419656.0,
    "conns": 1.1
  },
  "2b": {
    "available_memory": 108641236.0,
    "available_memory_no_overbooking": 10861216.0,
    "conns": 2.2
  }
}
$ jq -r 'keys[] as $k | "\($k) \(.[$k].conns)"' file.json
1a 1.1
2b 2.2

참고자료:

답변2

대체 솔루션(jtc)질문을 단순화하려면 일부 표준 cli를 사용하십시오.

bash $ echo $OUTPUT | jtc -rl -w'[+0]' -w'[+0][conns]' | sed 's/: {.*//g; s/^"conns"://' | xargs -n2
1 1.0
2 2.0
bash $ 

jtc(jq와 달리)는 기능을 json 작업으로 제한하는 유틸리티이므로(인터페이스가 매우 간단함) JSON 데이터 모델 외부의 작업은 외부 Unix 도구로 오프로드됩니다.

편집: 새 버전은 jtc더 간단한 솔루션을 지원합니다.

bash $ jtc -w'<conns>l:<con>v[-1]<key>k' -T '"{key} {con}"' -qq <<<$OUTPUT
1 1.0
2 2.0
bash $ 

관련 정보