jq 필터: 선택하여 전체 구조 표시

jq 필터: 선택하여 전체 구조 표시

다음 file1 json이 있습니다.

{
  "name": "eye",
  "attributes": [
    {
      "name": "Width",
      "value": "1920"
    },
    {
      "name": "Height",
      "value": "1080"
    },
    {
      "name": "WinKeyMapping",
      "value": "leftwin"
    }
  ],
  "starts": [
    {
      "name": "step1",
      "attributeList": [
        {
          "name": "Command",
          "value": "bash"
        },
        {
          "name": "Test",
          "value": "none"
        }
      ]
    }
  ]
}

그리고 다음 필터:

$ jq '.starts[].attributeList[]|select(.name=="Command")' file1
{
  "name": "Command",
  "value": "bash"
}
$

이 선택 항목의 전체 구조를 어떻게 얻을 수 있습니까?

예상 출력:

{
  "starts": [
    {
      "attributeList": [
        {
          "name": "Command",
          "value": "bash"
        }
      ]
    }
  ]
}

답변1

직접적으로jq:

jq '{ starts: [ { attributeList: (.starts[].attributeList 
                                  | map(select(.name == "Command"))) }] }' file.json

산출:

{
  "starts": [
    {
      "attributeList": [
        {
          "name": "Command",
          "value": "bash"
        }
      ]
    }
  ]
}

답변2

다음은 원하는 출력을 얻는 두 가지 옵션입니다.

원하지 않는 키를 제거할 수 있습니다.

jq 'del(.attributes, .name) | 
  .starts[].attributeList = map(.[].attributeList[] | select(.name == "Command"))'

또는 원하는 키를 선택할 수도 있습니다.

jq 'to_entries | map(select(.key == "starts")) | from_entries | 
  .starts[].attributeList = map(.[].attributeList[] | select(.name == "Command"))'

둘 다 동일한 결과를 제공합니다. 또한 원하는 경우 starts후자 ends의 경우 추가 or명령문을 추가할 수 있습니다 map(select((.key == "starts") or (.key == "ends"))).

답변3

보다 일반적인 접근 방식은 다음과 같습니다 jq.

def pick_out(q): path(q) as $path | ($path | length) as $length |
    delpaths(
        [
            paths(..) |
            select(length <= $length and $path[0:length] != . )
        ]
    );

이는 jq주어진 인수(호출일 수 있음)의 경로 어디에도 없는 문서에 대한 모든 경로를 제거하는 함수 입니다 select().

저장하면 pick_out.jq다음과 같이 사용할 수 있습니다.

jq 'include "pick_out";
    pick_out(
        .starts[].attributeList[] | select(.name == "Command")
    )' file.json

산출:

{
  "starts": [
    {
      "attributeList": [
        {
          "name": "Command",
          "value": "bash"
        }
      ]
    }
  ]
}

관련 정보