Usando jq para obter uma saída estruturada

1

Eu tenho o seguinte json como minha entrada para processamento jq

[
    {
        "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"
    }
]

usando ./csvtojson.sh bb.csv | jq 'map( {(.Category): del(.Category)})' como sugerido por @peak here , Eu alcancei até o json abaixo

  [
  {
    "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"
    }
  }
]

Tudo que eu quero é colocar a categoria no topo apenas uma vez e dividir este json para outro nível como eu fiz no passo anterior como este.

[
  {
    "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"
      }
    }
  }
]
    
por Ankit Sharma 07.03.2018 / 12:46

2 respostas

1

Conclua a solução jq :

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

No caso, se "Filesystem" key puder ser um número - altere .[($o.Filesystem)] para o seguinte .[($o.Filesystem | tostring)]

A saída:

[
  {
    "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"
      }
    }
  }
]
    
por 07.03.2018 / 13:35
1

Você está fazendo um desserviço a si mesmo reorganizando seu JSON dessa maneira.

O JSON original parece bem para mim.

Com isso, se você quiser obter todos os tamanhos para udev filesystems, você faria

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

Uma operação simples como essa no arquivo reorganizado seria

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

O arquivo rearranjado, além disso, suporta apenas um ponto de montagem por tipo de sistema de arquivos, tanto quanto eu posso ver. Se você tivesse vários sistemas de arquivos tmpfs , não sei onde você os colocaria.

    
por 07.03.2018 / 13:42

Tags