使用 jq 获得结构化输出

使用 jq 获得结构化输出

我有以下 json 作为 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"
    }
]

./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文件系统,那么我不知道您会将它们放在哪里。

相关内容