如何使用 jsawk 解析 bash 中的多维 JSON 数组?
How to parse multidimensional JSON array in bash using jsawk?
我有一个如下所示的数组。我想将整个数据解析到我的 bash 数组。
所以我可以从 ${bashaddr[0]} 调用第一个 "JSON addressLineOne",等等
[
{
"id":"f0c546d5-0ce4-55ee-e043-516e0f0afdc1",
"cardType":"WMUSGESTORECARD",
"lastFour":"1682",
"cardExpiryDate":"2012-01-16",
"firstName":"robert",
"lastName":"robishaw",
"addressLineOne":"Apt venue",
"addressLineTwo":"",
"city":"oakdale",
"state":"CT",
"postalCode":"06370",
"phone":"534534",
"isDefault":false
},
{
"id":"f0c546d5-0ce0-55ee-e043-516e0f0afdc1",
"cardType":"MASTERCARD",
"lastFour":"2731",
"cardExpiryDate":"2009-08-31",
"firstName":"robert",
"lastName":"robishaw",
"addressLineOne":"119 maple ave.",
"addressLineTwo":"",
"city":"uncasville",
"state":"CT",
"postalCode":"06382",
"phone":"7676456",
"isDefault":false
},
{
"id":"f0c546d5-0ce2-55ee-e043-516e0f0afdc1",
"cardType":"MASTERCARD",
"lastFour":"6025",
"cardExpiryDate":"2011-08-31",
"firstName":"robert",
"lastName":"robishaw",
"addressLineOne":"Angeline Street",
"addressLineTwo":"",
"city":"oakdale",
"state":"CT",
"postalCode":"06370",
"phone":"7867876",
"isDefault":false
}
]
我试过这样:
#!/bin/bash
addressLineOne="$(echo $card | jsawk 'return this.addressLineOne')"
但它给了我完整的地址:
["address 1","address 2","address 3"]
谢谢。
我在阅读评论之前写下了下面的答案,但这与 @4ae1e1 提供的答案完全相同,除了我没有放置 -r
标签以防您希望值保持引用(例如将其作为参数传递到其他地方)。
我知道这不是 jsawk,但请考虑 jq
:
jq '.[].addressLineOne' yourfile.txt
要访问特定值,您可以将记录号放在方括号中(从 0 开始作为第一个地址,依此类推)。例如获取第三条记录的地址:
jq '.[2].addressLineOne' yourfile.txt
要了解有关 jq
和高级用途的更多信息,请查看:http://jqplay.org
您需要做的是利用 -a
开关应用一些 post 处理并像这样过滤输出数组:
jsawk 'return this.addressLineOne' -a 'return this[0]'
来自文档:
-b <script> | -a <script>
Run the specified snippet of JavaScript before (-b) or after (-a)
processing JSON input. The `this` object is set to the whole JSON
array or object. This is used to preprocess (-b) or postprocess
(-a) the JSON array before or after the main script is applied.
This option can be specified multiple times to define multiple
before/after scripts, which will be applied in the order they
appeared on the command line.
我有一个如下所示的数组。我想将整个数据解析到我的 bash 数组。 所以我可以从 ${bashaddr[0]} 调用第一个 "JSON addressLineOne",等等
[
{
"id":"f0c546d5-0ce4-55ee-e043-516e0f0afdc1",
"cardType":"WMUSGESTORECARD",
"lastFour":"1682",
"cardExpiryDate":"2012-01-16",
"firstName":"robert",
"lastName":"robishaw",
"addressLineOne":"Apt venue",
"addressLineTwo":"",
"city":"oakdale",
"state":"CT",
"postalCode":"06370",
"phone":"534534",
"isDefault":false
},
{
"id":"f0c546d5-0ce0-55ee-e043-516e0f0afdc1",
"cardType":"MASTERCARD",
"lastFour":"2731",
"cardExpiryDate":"2009-08-31",
"firstName":"robert",
"lastName":"robishaw",
"addressLineOne":"119 maple ave.",
"addressLineTwo":"",
"city":"uncasville",
"state":"CT",
"postalCode":"06382",
"phone":"7676456",
"isDefault":false
},
{
"id":"f0c546d5-0ce2-55ee-e043-516e0f0afdc1",
"cardType":"MASTERCARD",
"lastFour":"6025",
"cardExpiryDate":"2011-08-31",
"firstName":"robert",
"lastName":"robishaw",
"addressLineOne":"Angeline Street",
"addressLineTwo":"",
"city":"oakdale",
"state":"CT",
"postalCode":"06370",
"phone":"7867876",
"isDefault":false
}
]
我试过这样:
#!/bin/bash
addressLineOne="$(echo $card | jsawk 'return this.addressLineOne')"
但它给了我完整的地址:
["address 1","address 2","address 3"]
谢谢。
我在阅读评论之前写下了下面的答案,但这与 @4ae1e1 提供的答案完全相同,除了我没有放置 -r
标签以防您希望值保持引用(例如将其作为参数传递到其他地方)。
我知道这不是 jsawk,但请考虑 jq
:
jq '.[].addressLineOne' yourfile.txt
要访问特定值,您可以将记录号放在方括号中(从 0 开始作为第一个地址,依此类推)。例如获取第三条记录的地址:
jq '.[2].addressLineOne' yourfile.txt
要了解有关 jq
和高级用途的更多信息,请查看:http://jqplay.org
您需要做的是利用 -a
开关应用一些 post 处理并像这样过滤输出数组:
jsawk 'return this.addressLineOne' -a 'return this[0]'
来自文档:
-b <script> | -a <script>
Run the specified snippet of JavaScript before (-b) or after (-a)
processing JSON input. The `this` object is set to the whole JSON
array or object. This is used to preprocess (-b) or postprocess
(-a) the JSON array before or after the main script is applied.
This option can be specified multiple times to define multiple
before/after scripts, which will be applied in the order they
appeared on the command line.