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
이를 어디에 배치할지 모르겠습니다.