使用JQ解析对象的JSON数组,使用select匹配对象元素中指定的键值,然后转换为CSV。
数据源:
{
"Other": [],
"Objects": [
{
"ObjectElementName": "Test 123",
"ObjectElementArray": [],
"ObjectElementUnit": "1"
},
{
"ObjectElementName": "Test ABC 1",
"ObjectElementArray": [],
"ObjectElementUnit": "2"
},
{
"ObjectElementName": "Test ABC 2",
"ObjectElementArray": [],
"ObjectElementUnit": "5"
}
],
"Language": "en-US"
}提取的JQ命令
jq -r '.Objects[] | select(.ObjectElementName | contains("ABC"))'给定的输出(仅限于单个对象,没有JSON结构).
{
"ObjectElementName": "Test ABC 1",
"ObjectElementArray": [],
"ObjectElementUnit": "2"
}
{
"ObjectElementName": "Test ABC 2",
"ObjectElementArray": [],
"ObjectElementUnit": "5"
}这种格式所需的输出(保留对象上方的JSON数组)
{
"Other": [],
"Objects": [
{
"ObjectElementName": "Test ABC 1",
"ObjectElementArray": [],
"ObjectElementUnit": "2"
},
{
"ObjectElementName": "Test ABC 2",
"ObjectElementArray": [],
"ObjectElementUnit": "5"
}
],
"Language": "en-US"
}这种格式需要输出,所以CSV转换可以执行
in2csv -f json --key Objects > output.csv输出CSV需要
ObjectElementName,ObjectElementUnit
Test ABC 1,2
Test ABC 2,5发布于 2019-11-22 03:05:43
如果您想要CSV,您可能应该使用jq的@csv过滤器,这在本质上保证了有效的CSV输出。例如,使用您的输入:
jq -r '
["ObjectElementName","ObjectElementUnit"],
(.Objects[]
| select(.ObjectElementName | test("ABC"))
| [.ObjectElementName,.ObjectElementUnit] )
| @csv' input.json生产:
"ObjectElementName","ObjectElementUnit"
"Test ABC 1","2"
"Test ABC 2","5"但是,如果您愿意承担这些风险,您可以将@csv替换为join(","),在目前的情况下,这将导致:
ObjectElementName,ObjectElementUnit
Test ABC 1,2
Test ABC 2,5https://stackoverflow.com/questions/58985676
复制相似问题