我尝试将以下JSON结构转换为CSV:
[
{
"node": "hosta;10.0.0.20;37038",
"adjacency": "hostb;10.0.0.10;4001"
},
{
"node": "hostc;10.0.0.16;52732",
"adjacency": "hostd;10.0.0.24;4040"
}
]
CSV应如下所示:
hosta,10.0.0.20,37038,hostb,10.0.0.10,4001
hostc,10.0.0.16,52732,hostd,10.0.0.24,4040
我知道如何使用split()
功能来"爆炸"使用分号作为分隔符将单个属性分为三个值 - 但是如何告诉jq我想在同一个传递中拆分node
和adjacency
属性?
(我可以看到我可以用更多的程序方法在Python中执行此操作,但我想知道是否有更优雅的方式使用jq中的map()
等函数执行此操作)
答案 0 :(得分:2)
如果您不希望引用字符串,并且如果您确定可以盲目地删除引号,则可以通过调用gsub/2
来修改@chepner的答案:
.[]
| [.node, .adjacency]
| map (split(";"))
| flatten
| @csv
| gsub("\"";"")
同样,如果您只想删除输出中的数字,可以将map(tonumber?//.)
添加到管道中:
.[]
| [.node, .adjacency]
| map (split(";"))
| flatten
| map(tonumber?//.)
| @csv
答案 1 :(得分:1)
从包含这两个值的每个对象构建一个数组,然后使用map
拆分字符串,flatten
以连接生成的数组,并使用@csv
生成CSV输出。
$ jq -r '.[] | [.node, .adjacency] | map (split(";")) | flatten | @csv' some.json
"hosta","10.0.0.20","37038","hostb","10.0.0.10","4001"
"hostc","10.0.0.16","52732","hostd","10.0.0.24","4040"