使用jq在JSON对象数组中拆分多个属性值

时间:2017-03-21 14:58:56

标签: json jq

我尝试将以下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我想在同一个传递中拆分nodeadjacency属性?

(我可以看到我可以用更多的程序方法在Python中执行此操作,但我想知道是否有更优雅的方式使用jq中的map()等函数执行此操作)

2 个答案:

答案 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"