Arrays 使用jq为json对象中的每个数组元素生成一行输出,该对象还包括json对象中的其他字段
我试图格式化一些由json对象组成的数据,这些json对象包括一些标识信息以及一个或多个json对象的数组,我希望结果是每个数组元素一行数据,其中每行应该包括来自数组元素的一些字段和来自标识信息的一些字段 我的样本数据如下:Arrays 使用jq为json对象中的每个数组元素生成一行输出,该对象还包括json对象中的其他字段,arrays,json,export-to-csv,ibm-mq,jq,Arrays,Json,Export To Csv,Ibm Mq,Jq,我试图格式化一些由json对象组成的数据,这些json对象包括一些标识信息以及一个或多个json对象的数组,我希望结果是每个数组元素一行数据,其中每行应该包括来自数组元素的一些字段和来自标识信息的一些字段 我的样本数据如下: { "eventCreation": { "timeStamp": "2020-06-06T15:07:20Z", "epoch": 1591456040 }, "eventData": { "applName": "SampleApp"
{
"eventCreation": {
"timeStamp": "2020-06-06T15:07:20Z",
"epoch": 1591456040
},
"eventData": {
"applName": "SampleApp",
"channelName": "SYSTEM.DEF.SVRCONN",
"connectionName": "127.0.0.1",
"channelType": "Svrconn",
"remoteProduct": "MQJM",
"remoteVersion": "09010005",
"activityTrace": [
{
"operationId": "Get",
"operationTime": "11:07:18",
"qmgrOpDuration": 102,
"reasonCode": {
"name": "No Msg Available",
"value": 2033
},
"objectName": "SYSTEM.DEFAULT.LOCAL.QUEUE"
},
{
"operationId": "Cb",
"operationTime": "11:07:18",
"qmgrOpDuration": 10,
"reasonCode": {
"name": "None",
"value": 0
},
"objectName": "SYSTEM.DEFAULT.LOCAL.QUEUE"
},
{
"operationId": "Cb",
"operationTime": "11:07:18",
"qmgrOpDuration": 12,
"reasonCode": {
"name": "None",
"value": 0
},
"objectName": "SYSTEM.DEFAULT.LOCAL.QUEUE"
}
]
}
}
我希望得到如下输出:
"SYSTEM.DEF.SVRCONN","Svrconn","127.0.0.1","SampleApp","MQJM","09010005","11:07:18","Get",102,"SYSTEM.DEFAULT.LOCAL.QUEUE",2033
"SYSTEM.DEF.SVRCONN","Svrconn","127.0.0.1","SampleApp","MQJM","09010005","11:07:18","Cb",10,"SYSTEM.DEFAULT.LOCAL.QUEUE",0
"SYSTEM.DEF.SVRCONN","Svrconn","127.0.0.1","SampleApp","MQJM","09010005","11:07:18","Cb",12,"SYSTEM.DEFAULT.LOCAL.QUEUE",0
我可以选择数组中的任意一个元素,让它打印3行,但如果我添加第二个元素,它将打印9行,第三个元素打印27行,以此类推 例如:
jq-r'{channelName:.eventData.channelName,channelType:.eventData.channelType,connectionName:.eventData.connectionName,applName:.eventData.applName,remoteProduct:.eventData.remoteProduct,remoteVersion:.eventData.remoteVersion,operationId:.eventData.activityTrace[].operationId}| | csv'TEST.json
将产生以下结果:
"SYSTEM.DEF.SVRCONN","Svrconn","127.0.0.1","SampleApp","MQJM","09010005","Get"
"SYSTEM.DEF.SVRCONN","Svrconn","127.0.0.1","SampleApp","MQJM","09010005","Cb"
"SYSTEM.DEF.SVRCONN","Svrconn","127.0.0.1","SampleApp","MQJM","09010005","Cb"
"SYSTEM.DEF.SVRCONN","Svrconn","127.0.0.1","SampleApp","MQJM","09010005","Get",102
"SYSTEM.DEF.SVRCONN","Svrconn","127.0.0.1","SampleApp","MQJM","09010005","Get",10
"SYSTEM.DEF.SVRCONN","Svrconn","127.0.0.1","SampleApp","MQJM","09010005","Get",12
"SYSTEM.DEF.SVRCONN","Svrconn","127.0.0.1","SampleApp","MQJM","09010005","Cb",102
"SYSTEM.DEF.SVRCONN","Svrconn","127.0.0.1","SampleApp","MQJM","09010005","Cb",10
"SYSTEM.DEF.SVRCONN","Svrconn","127.0.0.1","SampleApp","MQJM","09010005","Cb",12
"SYSTEM.DEF.SVRCONN","Svrconn","127.0.0.1","SampleApp","MQJM","09010005","Cb",102
"SYSTEM.DEF.SVRCONN","Svrconn","127.0.0.1","SampleApp","MQJM","09010005","Cb",10
"SYSTEM.DEF.SVRCONN","Svrconn","127.0.0.1","SampleApp","MQJM","09010005","Cb",12
如果我添加第二个这样的选项:
"SYSTEM.DEF.SVRCONN","Svrconn","127.0.0.1","SampleApp","MQJM","09010005","11:07:18","Get",102,"SYSTEM.DEFAULT.LOCAL.QUEUE",2033
"SYSTEM.DEF.SVRCONN","Svrconn","127.0.0.1","SampleApp","MQJM","09010005","11:07:18","Cb",10,"SYSTEM.DEFAULT.LOCAL.QUEUE",0
"SYSTEM.DEF.SVRCONN","Svrconn","127.0.0.1","SampleApp","MQJM","09010005","11:07:18","Cb",12,"SYSTEM.DEFAULT.LOCAL.QUEUE",0
jq-r'{channelName:.eventData.channelName,channelType:.eventData.channelType,connectionName:.eventData.connectionName,applName:.eventData.applName,remoteProduct:.eventData.remoteProduct,remoteVersion:.eventData.remoteVersion,operationId:.eventData.activityTrace[].operationId,qmgrOpDuration:.eventData.activityTrace[].qmgrOpDuration}|[.]|@csv'TEST.json
将产生以下结果:
"SYSTEM.DEF.SVRCONN","Svrconn","127.0.0.1","SampleApp","MQJM","09010005","Get"
"SYSTEM.DEF.SVRCONN","Svrconn","127.0.0.1","SampleApp","MQJM","09010005","Cb"
"SYSTEM.DEF.SVRCONN","Svrconn","127.0.0.1","SampleApp","MQJM","09010005","Cb"
"SYSTEM.DEF.SVRCONN","Svrconn","127.0.0.1","SampleApp","MQJM","09010005","Get",102
"SYSTEM.DEF.SVRCONN","Svrconn","127.0.0.1","SampleApp","MQJM","09010005","Get",10
"SYSTEM.DEF.SVRCONN","Svrconn","127.0.0.1","SampleApp","MQJM","09010005","Get",12
"SYSTEM.DEF.SVRCONN","Svrconn","127.0.0.1","SampleApp","MQJM","09010005","Cb",102
"SYSTEM.DEF.SVRCONN","Svrconn","127.0.0.1","SampleApp","MQJM","09010005","Cb",10
"SYSTEM.DEF.SVRCONN","Svrconn","127.0.0.1","SampleApp","MQJM","09010005","Cb",12
"SYSTEM.DEF.SVRCONN","Svrconn","127.0.0.1","SampleApp","MQJM","09010005","Cb",102
"SYSTEM.DEF.SVRCONN","Svrconn","127.0.0.1","SampleApp","MQJM","09010005","Cb",10
"SYSTEM.DEF.SVRCONN","Svrconn","127.0.0.1","SampleApp","MQJM","09010005","Cb",12
使用您的方法,以下是一个解决方案:
.eventData
| ({channelName, channelType, connectionName, applName, remoteProduct, remoteVersion}
+ ( .activityTrace[]
| { operationTime, operationId, qmgrOpDuration, objectName, v: .reasonCode.value}))
| [.[]]
| @csv
关键是只迭代一次
还请注意,此解决方案通过使用{foo:.foo}
可以缩写为{foo}
这一事实部分实现了其简洁性
稍微有效一点的方法
.第一次操作
谢谢你的快速回答。有没有其他方法可以推荐?有没有办法在阵列开始时输出
operationTime
而无需第二次重新排列管道?再次感谢。有没有办法在csv输出开始时输出operationTime,而无需第二次管道传输来重新排列对象中值的顺序?请参阅.operationTime first
部分。我的意思是像这样输出“11:07:18”,“SYSTEM.DEF.SVRCONN”,“SVRCONN”,“127.0.0.1”,“SampleApp”,“MQJM”,“09010005”,“Get”,102,“SYSTEM.DEFAULT.LOCAL.QUEUE”,2033
这就是使用$x的解决方案所做的。