使用jq

时间:2018-08-21 08:23:29

标签: arrays json formatting jq

我在名为myfile.json的文件中有一些数据。我需要使用jq格式化-在JSON中看起来像这样;

{ "result": [ { "service": "ebsvolume", "name": "gtest", "resourceIdentifier": "vol-999999999999", "accountName": "g-test-acct", "vendorAccountId": "12345678912", "availabilityZone": "ap-southeast-2c", "region": "ap-southeast-2", "effectiveHourly": 998.56, "totalSpend": 167.7, "idle": 0, "lastSeen": "2018-08-16T22:00:00Z", "volumeType": "io1", "state": "in-use", "volumeSize": 180, "iops": 2000, "throughput": 500, "lastAttachedTime": "2018-08-08T22:00:00Z", "lastAttachedId": "i-086f957ee", "recommendations": [ { "action": "Rightsize", "preferenceOrder": 2, "risk": 0, "savingsPct": 91, "savings": 189.05, "volumeType": "gp2", "volumeSize": 120, }, { "action": "Rightsize", "preferenceOrder": 4, "risk": 0, "savingsPct": 97, "savings": 166.23, "volumeType": "gp2", "volumeSize": 167, }, { "action": "Rightsize", "preferenceOrder": 6, "risk": 0, "savingsPct": 91, "savings": 111.77, "volumeType": "gp2", "volumeSize": 169, } ] } }

我将其格式化为以下

jq '.result[] | [.service,.name,.resourceIdentifier,.accountName,.vendorAccountId,.availabilityZone,.region,.effectiveHourly,.totalSpend,.idle,.lastSeen,.volumeType,.state,.volumeSize,.iops,.throughput,.lastAttachedTime,.lastAttachedId] |@csv' ./myfile.json

这将获得以下输出;

"\"ebsvolume\",\"gtest\",\"vol-999999999999\",\"g-test-acct\",\"12345678912\",\"ap-southeast-2c\",\"ap-southeast-2\",998.56,167.7,0,\"2018-08-16T22:00:00Z\",\"io1\",\"in-use\",180,2000,500,\"2018-08-08T22:00:00Z\",\"i-086f957ee\""

我知道了这一点,但它并非我想要达到的目标。我希望每个建议都在单独的行下列出,而不是在同一行的末尾列出。

jq '.result[] | [.service,.name,.resourceIdentifier,.accountName,.vendorAccountId,.availabilityZone,.region,.effectiveHourly,.totalSpend,.idle,.lastSeen,.volumeType,.state,.volumeSize,.iops,.throughput,.lastAttachedTime,.lastAttachedId,.recommendations[].action] |@csv' ./myfile.json

此网:

"\"ebsvolume\",\"gtest\",\"vol-999999999999\",\"g-test-acct\",\"12345678912\",\"ap-southeast-2c\",\"ap-southeast-2\",998.56,167.7,0,\"2018-08-16T22:00:00Z\",\"io1\",\"in-use\",180,2000,500,\"2018-08-08T22:00:00Z\",\"i-086f957ee\",\"Rightsize\",\"Rightsize\",\"Rightsize\""

我想要的是

"\"ebsvolume\",\"gtest\",\"vol-999999999999\",\"g-test-acct\",\"12345678912\",\"ap-southeast-2c\",\"ap-southeast-2\",998.56,167.7,0,\"2018-08-16T22:00:00Z\",\"io1\",\"in-use\",180,2000,500,\"2018-08-08T22:00:00Z\",\"i-086f957ee\", \"Rightsize\", \"Rightsize\", \"Rightsize\""

所以不能完全确定如何处理jq的“建议”部分中的数组,我认为它可能被称为“展平”?

2 个答案:

答案 0 :(得分:0)

您可以尝试以下方法:

jq '.result[] | [ flatten[] | try(.action) // . ] | @csv' file
"\"ebsvolume\",\"gtest\",\"vol-999999999999\",\"g-test-acct\",\"12345678912\",\"ap-southeast-2c\",\"ap-southeast-2\",998.56,167.7,0,\"2018-08-16T22:00:00Z\",\"io1\",\"in-use\",180,2000,500,\"2018-08-08T22:00:00Z\",\"i-086f957ee\",\"Rightsize\",\"Rightsize\",\"Rightsize\""

flatten照其说法。

try测试.action既不是null也不是false。如果是这样,它将发出其值,否则jq发出另一个值(运算符//)。

将过滤后的值放入数组中,以便使用@csv运算符对其进行转换。

答案 1 :(得分:0)

这对我来说并不过分,实际上它省略了前一个数组中的所有数据-但是,谢谢!

我得出以下结论,因为它没有将Rightizeize详细信息放在单独的行上,但必须这样做:

jq -r'.result [] | [.service..name.resourceIdentifier.accountName.vendorAccountId.availabilityZone.region.validHourly.totalSpend.idle.lastSeen.volumeType.state.volumeSize.iops.throughput .. lastAttachedTime,.lastAttachedId,.recommendations [] []] @ csv'./myfile.json