linux - Shell脚本将json对象分配给变量以进行迭代
问题描述
DATA="$(curl "https://www.alphavantage.co/query?function=SYMBOL_SEARCH&keywords=BA&apikey=demo" | jq '.bestMatches' | jq '.[] | ."1. symbol"')"
我想迭代 DATA 变量,理想情况下是一个数组。我想在这里做的是两个方面。
- 我需要一种方法来选择“matchScore”大于 0.5 的所有记录的“1. symbol”属性。这对我来说是个有问题的事情,因为 matchScore 包含一个字符串,而不是一个数字。
- 我想将选定的“1. Symbol”属性存储在一个变量中,稍后我可以对其进行迭代以执行更多操作。
{
"bestMatches": [
{
"1. symbol": "BA",
"2. name": "The Boeing Company",
"3. type": "Equity",
"4. region": "United States",
"5. marketOpen": "09:30",
"6. marketClose": "16:00",
"7. timezone": "UTC-05",
"8. currency": "USD",
"9. matchScore": "1.0000"
},
{
"1. symbol": "BAC",
"2. name": "Bank of America Corporation",
"3. type": "Equity",
"4. region": "United States",
"5. marketOpen": "09:30",
"6. marketClose": "16:00",
"7. timezone": "UTC-05",
"8. currency": "USD",
"9. matchScore": "0.8000"
},
{
"1. symbol": "BABA",
"2. name": "Alibaba Group Holding Limited",
"3. type": "Equity",
"4. region": "United States",
"5. marketOpen": "09:30",
"6. marketClose": "16:00",
"7. timezone": "UTC-05",
"8. currency": "USD",
"9. matchScore": "0.6667"
},
{
"1. symbol": "GOLD",
"2. name": "Barrick Gold Corporation",
"3. type": "Equity",
"4. region": "United States",
"5. marketOpen": "09:30",
"6. marketClose": "16:00",
"7. timezone": "UTC-05",
"8. currency": "USD",
"9. matchScore": "0.5714"
},
{
"1. symbol": "BIDU",
"2. name": "Baidu Inc.",
"3. type": "Equity",
"4. region": "United States",
"5. marketOpen": "09:30",
"6. marketClose": "16:00",
"7. timezone": "UTC-05",
"8. currency": "USD",
"9. matchScore": "0.5000"
},
{
"1. symbol": "BAYRY",
"2. name": "Bayer Aktiengesellschaft",
"3. type": "Equity",
"4. region": "United States",
"5. marketOpen": "09:30",
"6. marketClose": "16:00",
"7. timezone": "UTC-05",
"8. currency": "USD",
"9. matchScore": "0.4000"
},
{
"1. symbol": "BLDP",
"2. name": "Ballard Power Systems Inc.",
"3. type": "Equity",
"4. region": "United States",
"5. marketOpen": "09:30",
"6. marketClose": "16:00",
"7. timezone": "UTC-05",
"8. currency": "USD",
"9. matchScore": "0.3333"
},
{
"1. symbol": "BHC",
"2. name": "Bausch Health Companies Inc.",
"3. type": "Equity",
"4. region": "United States",
"5. marketOpen": "09:30",
"6. marketClose": "16:00",
"7. timezone": "UTC-05",
"8. currency": "USD",
"9. matchScore": "0.3333"
},
{
"1. symbol": "BK",
"2. name": "The Bank of New York Mellon Corporation",
"3. type": "Equity",
"4. region": "United States",
"5. marketOpen": "09:30",
"6. marketClose": "16:00",
"7. timezone": "UTC-05",
"8. currency": "USD",
"9. matchScore": "0.1538"
}
]
}
以上是我得到的json对象。
解决方案
使用 tonumber 将字段值从整数转换为数字,因此:
readarray data <<< "$(jq -r '.bestMatches[] | select(."9. matchScore" | tonumber > 0.5) | ."1. symbol"' jq)"
将 jq 命令的输出重定向到 readarray 以创建一个数组。
推荐阅读
- amazon-web-services - 共享的公共映像或社区映像是否可以像 AWS 中的私有映像那样是特定于区域的?
- angular - 如何让 uiSignal 处理嵌套的异步调用?
- python - Kolmogorov Smirnov 检验 python 中的拟合优度
- cuda - 如何在远程服务器上调试 CUDA 代码?
- django - 您是否忘记注册或加载此标签?
- php - 在 laravel-5.6 中找不到类“应用程序/帖子”
- azure - Microsoft Azure - 面向公众的负载均衡器后面的 2 个 VM
- asp.net-core - 通过托管 IdentityServer 的单独微服务使用 OATH 保护 WebApi 的集成测试
- android - 在 API 级别 23 中删除了 Android 权限
- c++ - 尝试为成员进行回调