jq는 상위 이름, 값 및 하위 값을 인쇄합니다.

jq는 상위 이름, 값 및 하위 값을 인쇄합니다.

저는 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": {
    ...
  }
}

나는 두 가지 일을 하고 싶다:

  1. 특정 상위 이름을 선택하고 이름과 모든 하위 값(개수 및 모든 필드 개수)을 표시하도록 합니다.
  2. 필드 수가 전체 상위 수보다 적은 모든 상위의 이름을 표시합니다.

다음 명령을 거의 사용했지만 여전히 원하는 위치에 있지 않습니다.

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의 모든 부분입니다 . 그런 다음 나머지 모든 부분에 대한 최상위 키 이름을 추출합니다.

관련 정보