jq 和数组的两个东西:键和值:

jq 和数组的两个东西:键和值:

我有这个脚本:

curl -sX 'GET' \
  'https://api.coingecko.com/api/v3/exchange_rates' \
  -H 'accept: application/json' | jq -rc '.[]|select(.)|keys,(.[].value|tostring)'

JSON 的来源为:

{
  "rates": {
    "btc": {
      "name": "Bitcoin",
      "unit": "BTC",
      "value": 1,
      "type": "crypto"
    },
    "eth": {
      "name": "Ether",
      "unit": "ETH",
      "value": 14.327,
      "type": "crypto"
    }, ...

我无法创建键(硬币 ID,“btc”)-值(硬币价值,“1”)对,我需要的是硬币的 ID 及其价值:

btc 1
eth 14.327

我怎样才能将这两个独立的数组合并为一个?

答案1

使用to_entries过滤器获取配对。它将字典转换为项目数组:

$ curl <url> | jq ".rates | to_entries"

[
    {
        "key": "btc",
        "value": {
            "name": "Bitcoin",
            "unit": "BTC",
            "value": 1,
            "type": "crypto"
        }
    },
    {
        "key": "eth",
        "value: {...}
    },
    },
    { ... }
]

一旦您有了这样的条目,您就可以访问每个项目的.key.value.value以获取您想要的对:

$ curl <url> | jq '.rates | to_entries | .[] | [.key, .value.value]'

["btc", 1]
["eth", 14.376]
[...]

将它们转换为字符串也是一样:

$ curl <url> | jq -r '.rates | to_entries | .[] | "\(.key) \(.value.value)"'
btc 1
eth 14.368
...

请注意,select(.)您之前所拥有的似乎完全是多余的......

相关内容