jq를 사용하여 구조화된 출력 얻기

jq를 사용하여 구조화된 출력 얻기

jq 처리를 위한 입력으로 다음 json이 있습니다.

[
    {
        "Category": "Disk Partition Details",
        "Filesystem": "udev",
        "Size": "3.9G",
        "Used": 0,
        "Avail": "3.9G",
        "Use%": "0%",
        "Mounted": "/dev"
    },
    {
        "Category": "Disk Partition Details",
        "Filesystem": "tmpfs",
        "Size": "799M",
        "Used": "34M",
        "Avail": "766M",
        "Use%": "5%",
        "Mounted": "/run"
    }
]

./csvtojson.sh bb.csv | jq 'map( {(.Category): del(.Category)})'권장대로 사용 @高峰여기요, 나는 다음 JSON에 도착했습니다

  [
  {
    "Disk Partition Details": {
      "Filesystem": "udev",
      "Size": "3.9G",
      "Used": 0,
      "Avail": "3.9G",
      "Use%": "0%",
      "Mounted": "/dev"
    }
  },
  {
    "Disk Partition Details": {
      "Filesystem": "tmpfs",
      "Size": "799M",
      "Used": "34M",
      "Avail": "766M",
      "Use%": "5%",
      "Mounted": "/run"
    }
  }
]

내가 원하는 것은 카테고리를 맨 위에 한 번 배치하고 이전 단계에서 했던 것처럼 이 json을 다른 수준으로 나누는 것입니다.

[
  {
    "Disk Partition Details": {
      "udev" :{
      "Size": "3.9G",
      "Used": 0,
      "Avail": "3.9G",
      "Use%": "0%",
      "Mounted": "/dev"
      },

      "tmpfs" : {
      "Size": "799M",
      "Used": "34M",
      "Avail": "766M",
      "Use%": "5%",
      "Mounted": "/run"
      }
    }
  }
]

답변1

충분히jq해결책:

jq '[ group_by(.Category)[0] | .[0].Category as $k 
      | { ($k): (reduce .[] as $o 
                    ({}; .[($o.Filesystem)] = ($o | del($o.Category, $o.Filesystem)))
                ) 
        } 
    ]' input.json

"Filesystem"키가 숫자일 수 있는 경우 - .[($o.Filesystem)]다음으로 변경.[($o.Filesystem | tostring)]


산출:

[
  {
    "Disk Partition Details": {
      "udev": {
        "Size": "3.9G",
        "Used": 0,
        "Avail": "3.9G",
        "Use%": "0%",
        "Mounted": "/dev"
      },
      "tmpfs": {
        "Size": "799M",
        "Used": "34M",
        "Avail": "766M",
        "Use%": "5%",
        "Mounted": "/run"
      }
    }
  }
]

답변2

이런 방식으로 JSON을 재배치하면 해를 끼치게 됩니다.

원시 JSON이 나에게는 괜찮아 보입니다.

udev이렇게 하면 모든 크기의 파일 시스템을 얻으려면 할 수 있습니다.

jq '.[] | select(.Filesystem == "udev").Size' file.json 

재구성된 파일에 대한 비슷한 간단한 작업은 다음과 같습니다.

jq '.[] | ."Disk Partition Details".udev.Size' file1.json

내가 아는 한, 재배열된 파일은 파일 시스템 유형당 하나의 마운트 지점만 지원합니다. 여러 개의 파일 시스템이 있는 경우 tmpfs이를 어디에 배치할지 모르겠습니다.

관련 정보