首页 > 解决方案 > Shell脚本将json对象分配给变量以进行迭代

问题描述

DATA="$(curl "https://www.alphavantage.co/query?function=SYMBOL_SEARCH&keywords=BA&apikey=demo" | jq '.bestMatches' | jq '.[] | ."1. symbol"')"

我想迭代 DATA 变量,理想情况下是一个数组。我想在这里做的是两个方面。

  1. 我需要一种方法来选择“matchScore”大于 0.5 的所有记录的“1. symbol”属性。这对我来说是个有问题的事情,因为 matchScore 包含一个字符串,而不是一个数字。
  2. 我想将选定的“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对象。

标签: linuxbashshellcurljq

解决方案


使用 tonumber 将字段值从整数转换为数字,因此:

readarray data <<< "$(jq -r '.bestMatches[] | select(."9. matchScore" | tonumber > 0.5) | ."1. symbol"' jq)"

将 jq 命令的输出重定向到 readarray 以创建一个数组。


推荐阅读