Получение первого элемента данных json с помощью jq

Я работаю с Poloniex API. При использовании функции returnTicker данные поступают следующим образом.

завиток "https://poloniex.com/public?command=returnTicker"

{
  "BTC_BTS": {
    "id": 14,
    "last": "0.00000111",
    "lowestAsk": "0.00000112",
    "highestBid": "0.00000110",
    "percentChange": "0.09900990",
    "baseVolume": "3.12079869",
    "quoteVolume": "2318738.79293715",
    "isFrozen": "0",
    "high24hr": "0.00000152",
    "low24hr": "0.00000098"
  },
  "BTC_DASH": {
    "id": 24,
    "last": "0.00466173",
    "lowestAsk": "0.00466008",
    "highestBid": "0.00464358",
    "percentChange": "0.02318430",
    "baseVolume": "1.98111396",
    "quoteVolume": "425.22973220",
    "isFrozen": "0",
    "high24hr": "0.00482962",
    "low24hr": "0.00450482"
....

  },
  "USDT_GRT": {
    "id": 497,
    "last": "0.72811272",
    "lowestAsk": "0.75999916",
    "highestBid": "0.72740000",
    "percentChange": "0.48594450",
    "baseVolume": "133995.43411815",
    "quoteVolume": "194721.36672887",
    "isFrozen": "0",
    "high24hr": "0.79000000",
    "low24hr": "0.45000020"
  },
  "TRX_SUN": {
    "id": 498,
    "last": "500.00000000",
    "lowestAsk": "449.99999999",
    "highestBid": "100.00000000",
    "percentChange": "0.00000000",
    "baseVolume": "0.00000000",
    "quoteVolume": "0.00000000",
    "isFrozen": "0",
    "high24hr": "0.00000000",
    "low24hr": "0.00000000"
  }
}  


Я хочу, чтобы вывод был таким

BTC_BTS : 14 : 0.00000111 : 0.00000112 : 0.00000110 : 0.09900990 : 3.12079869 : 2318738.79293715 : 0 : 0.00000152 : 0.00000098
...
USDT_GRT : 497 : 0.72428700 : 0.75999958 : 0.72630001 : 0.47813685 : 133968.74968533 : 194695.96886712 : 0 : 0.79000000 : 0.45000020
TRX_SUN : 498 : 500.00000000 : 449.99999999 : 100.00000000 : 0.00000000 : 0.00000000 : 0.00000000 : 0 : 0.00000000 : 0.00000000

Я использую jq, и моя проблема связана с доступом к имени валютной пары.

Я мог бы сделать это;

14 : 0.00000111 : 0.00000112 : 0.00000110 : 0.09900990 : 3.12079869 : 2318738.79293715 : 0 : 0.00000152 : 0.00000098
...
497 : 0.72428700 : 0.75999958 : 0.72630001 : 0.47813685 : 133968.74968533 : 194695.96886712 : 0 : 0.79000000 : 0.45000020
498 : 500.00000000 : 449.99999999 : 100.00000000 : 0.00000000 : 0.00000000 : 0.00000000 : 0 : 0.00000000 : 0.00000000

с помощью этой команды;

curl "https://poloniex.com/public?command=returnTicker" |jq -r | jq '.[] | (.id|tostring) + " : " + (.last|tostring) + " : " + (.lowestAsk|tostring) + " : " + (.highestBid|tostring) + " : " + (.percentChange|tostring) + " : " + (.baseVolume|tostring) + " : " + (.quoteVolume|tostring) + " : " + (.isFrozen|tostring) + " : " + (.high24hr|tostring) + " : " + (.low24hr|tostring)'|jq -r

не только это, в каждом конвейере jq я не могу получить доступ к первому элементу json

Я не имею в виду пайплайн |jq .BTC_BTS или |jq .USDT_GRT.

|кк . дает весь json, |jq .[] дает подэлементы после первого элемента.

Как я могу получить доступ к первому пути?

Кстати, я, возможно, написал глупый и длинный пайплайн с помощью jq. Если у вас есть идея преобразовать весь json в данные строки-столбца, я открыт для ваших идей.

Спасибо всем за ваши ответы.

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
0
592
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я думаю, это делает то, что вы хотите.

curl -s "https://poloniex.com/public?command=returnTicker" | \
jq -r 'to_entries
       | .[] 
       | [ .key, (.value | to_entries | .[] | .value) ] 
       | join(" : ")'

Короче говоря, поместите все в массив и используйте join для получения желаемого результата.

Обновлять

Как отмечает luciole75w, в моем решении слишком много шагов. Это лучше.

jq -r 'to_entries[] | [ .key, .value[] ] | join(" : ")'

Тем не менее, я бы использовал решение пика. Мой не гарантирует, что столбцы одинаковы для каждой строки.

Не за что. Однако, просто для протокола, другой ответ лучше.

user197693 21.12.2020 21:46

На всякий случай лучше не предполагать, что порядок ключей одинаков во всех внутренних объектах. Следовательно:

keys_unsorted as $outer
| (.[$outer[0]] | keys_unsorted) as $keys
| $outer[] as $k
| [ $k, .[$k][$keys[]] ]
| join(" : ")

Спасибо. чтобы помочь всем, я хочу добавить, что эту часть нужно использовать вот так" |jq -r 'эта часть команды'. это решает проблему.

barismanco 21.12.2020 13:30

Другие вопросы по теме