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