저는 jq를 처음 접했지만 일단 이해하고 나면 제 작업 흐름에 도움이 될 것이라고 확신합니다. 다음과 같은 데이터를 받았습니다.
{
"parent_name1": {
"parent_count": 2000,
"fields": {
"field1_count": 2000,
"field2_count": 2000,
...
"fieldx_count": 20
}
},
"parent_name2": {
"parent_count": 1000,
"fields": {
"field1_count": 1000,
"field2_count": 1000,
...
"fieldx_count": 100
}
},
"parent_namex": {
...
}
}
나는 두 가지 일을 하고 싶다:
- 특정 상위 이름을 선택하고 이름과 모든 하위 값(개수 및 모든 필드 개수)을 표시하도록 합니다.
- 필드 수가 전체 상위 수보다 적은 모든 상위의 이름을 표시합니다.
다음 명령을 거의 사용했지만 여전히 원하는 위치에 있지 않습니다.
jq '."parent_name1"'
"parent_count", "fields" 및 모든 필드 수는 제공되지만 상위 이름은 제공되지 않습니다.
이것:
jq '.[] | {parent_count: .parent_count, fields: .fields[]} | select(.fields < .parent_count)'
"parent_count" 및 총 필드 수를 반환하지만 상위 이름이나 개별 필드 수는 반환하지 않습니다. 필드 개수의 합계가 어디서 나오는지 알고 있지만 {fields: .fields[]}
, 이것이 없으면 원하는 결과에 근접할 수 있는 방법을 찾을 수 없습니다.
답변1
눈치채셨듯이,
jq '.parent_name2' file
또는 섹션 이름을 인수로 제공합니다.
jq --arg parent 'parent_name2' '.[$parent]' file
parent_name2
최상위 키인 JSON 객체 는 출력되지 않습니다 .
그러나 우리는 할 수 있습니다만들다필수 데이터가 포함된 개체:
$ jq --arg parent 'parent_name2' '{($parent): .[$parent]}' file
예제 문서의 삭제된 변형이 주어지면 이는 다음과 같습니다.
{
"parent_name2": {
"parent_count": 1000,
"fields": {
"field1_count": 1000,
"field2_count": 1000,
"fieldx_count": 100
}
}
}
.parent_count
두 번째 쿼리(향후에는 질문당 하나의 쿼리만 쿼리하세요)에서는 값이 해당 개수의 합보다 작은 .fields
개체에 해당하는 최상위 키 이름을 요청할 수 있습니다 .
jq -r 'del(.[] | select(.parent_count >= (.fields | add ))) | keys[]' file
이것삭제.fields
합계가 해당 값 보다 크거나 같은 값 .parent_count
의 모든 부분입니다 . 그런 다음 나머지 모든 부분에 대한 최상위 키 이름을 추출합니다.