我想使用jq从JSON文件中提取数据并将其写入CSV文件。
这是我的数据示例:
[
{
"media": {
"track": [
{
"attype": "General",
"FileExtension": "MP4",
"Format": "MPEG-4"
},
{
"attype": "Video",
"Format": "MPEG Video"
}
]
}
},
{
"media": {
"track": [
{
"attype": "General",
"FileExtension": "ts",
"Format": "MPEG-TS"
},
{
"attype": "Video",
"Format": "MPEG Video"
}
]
}
}
]
这是所需的输出:
"MP4","MPEG-4","MPEG Video"
"ts","MPEG-TS","MPEG Video"
这是我的jq代码:
.[].media.track[] |
[
(select(.attype =="General") | .FileExtension, .Format),
(select(.attype =="Video") | .Format)
] | @csv
这是实际输出:
"MP4","MPEG-4"
"MPEG Video"
"ts","MPEG-TS"
"MPEG Video"
我已经尝试过使用flatten
过滤器和方括号[]
的不同用法来构造数组,但是没有用。如何使用jq达到所需的输出?
答案 0 :(得分:4)
您处在正确的轨道上(按双关语)–您只需按如下所示扩展.track即可:
.[].media.track
| [.[]
| (select(.attype =="General") | .FileExtension, .Format),
(select(.attype =="Video") | .Format) ]
| @csv
如果您发现所有这些括号和括号过于分散注意力,则可以选择:
.[].media.track
| map( if .attype =="General" then .FileExtension, .Format
elif .attype =="Video" then .Format
else empty
end )
| @csv
答案 1 :(得分:3)
一种解决方案是为每个媒体而不是每个轨道创建一个单元格数组:
.[].media |
[
.track[] |
(select(.attype =="General") | .FileExtension, .Format),
(select(.attype =="Video") | .Format)
] | @csv