#json #jq
#json #jq
Вопрос:
У меня есть следующие данные, выходные данные нескольких каналов jq:
[
{
"Russia": 1073849
}
]
[
{
"Spain": 593730
}
]
[
{
"France": 387252
}
]
[
{
"UK": 371125
}
]
Мой желаемый результат:
[
{
"Russia": 1073849
},
{
"Spain": 593730
},
{
"France": 387252
},
{
"UK": 371125
}
]
Основываясь на похожих вопросах, которые я пробовал '.[]|transpose|map(add)'
, и это выдает ошибку: Cannot index object with number
. Также я не могу group_by(key)
, потому что в объектах нет общего ключа.
Комментарии:
1. это вывод нескольких каналов jq.
2.
curl -s https://corona-stats.online/?format=json | jq '.data[]|select(.continent|test("Europe"))|del(.countryInfo,.updated)|[{(.country):.cases}]'
3. Хорошо .. так
jq '.[][0]'
или для приведенного выше примера| .[]
?4. это даст только объекты, но они не находятся внутри массива, поэтому я не могу, например, использовать
|.[1]
для доступа к данным по индексу. извините, я не эксперт в использовании jq5. @ggorlen становится обычным видеть такие вещи, как файлы журналов с документами JSON в качестве записей. Это недопустимый файл JSON как таковой, но, тем не менее, он содержит допустимые документы JSON. Один документ JSON на строку.
Ответ №1:
Предполагая, что input.json
файл является:
[{"Russia": 1073849}]
[{"Spain": 593730}]
[{"France": 387252}]
[{ "UK": 371125}]
Тогда это:
jq -s 'reduce .[] as $x ([]; . $x)' input.json
ВОЗВРАТ:
[
{
"Russia": 1073849
},
{
"Spain": 593730
},
{
"France": 387252
},
{
"UK": 371125
}
]
Примечания:
jq
можно объединить массивы с помощью[1] [2]
возвращает[1,2]
.-s
Флаг считываетinput.json
и помещает все записи в массив. Таким образом, вы получаете массив массивов, с которыми вы можете объединятьсяreduce
.
Это может быть упрощено еще больше с:
jq -s 'add' input.json
Ответ №2:
Если я правильно понимаю, вы хотите создать массив в качестве выходных данных. Для этого вы можете переместить оболочку массива из конечного объекта во весь jq
вызов:
curl -s https://corona-stats.online/?format=json |
jq '[ .data[]
| select(.continent | test("Europe"))
| {(.country): .cases}
]'
Вывод после | [0:4]
:
[
{
"Russia": 1073849
},
{
"Spain": 603167
},
{
"France": 395104
},
{
"UK": 374228
}
]
Если вам нужен объект, вы могли бы использовать:
curl -s https://corona-stats.online/?format=json |
jq '[ .data[]
| select(.continent | test("Europe"))
]
| map({(.country): .cases})
| add'
или:
curl -s https://corona-stats.online/?format=json |
jq '[ .data[]
| select(.continent | test("Europe"))
]
| reduce .[] as $e ({}; .[$e.country] = $e.cases)'
Вывод:
{
"Russia": 1073849,
"Spain": 603167,
"France": 395104,
"UK": 374228,
"Italy": 289990,
"Germany": 264375,
"Ukraine": 159702,
"Romania": 105298,
"Belgium": 94306,
"Sweden": 87345,
"Netherlands": 84778,
"Poland": 75134,
"Belarus": 74552,
"Portugal": 65021,
"Switzerland": 47751,
"Moldova": 43734,
"Czechia": 38187,
"Austria": 34305,
"Serbia": 32511,
"Ireland": 31549,
"Bosnia": 23929,
"Denmark": 20571,
"Bulgaria": 18061,
"Macedonia": 15925,
"Hungary": 13879,
"Croatia": 13749,
"Greece": 13730,
"Norway": 12330,
"Albania": 11672,
"Finland": 8725,
"Luxembourg": 7244,
"Montenegro": 6900,
"Slovakia": 5768,
"Slovenia": 3831,
"Lithuania": 3397,
"Estonia": 2722,
"Malta": 2454,
"Iceland": 2174,
"Latvia": 1482,
"Andorra": 1438,
"San Marino": 723,
"Channel Islands": 639,
"Faroe Islands": 428,
"Isle of Man": 339,
"Gibraltar": 334,
"Monaco": 177,
"Liechtenstein": 111,
"Holy See (Vatican City State)": 12
}
Хотя для этого набора данных это не имеет значения, я бы предпочел использовать == "Europe"
, а не test("Europe")
, что немного менее точно.
Комментарии:
1. большое вам спасибо, побочный вопрос, возможно ли создать ассоциативный массив вместо массива объектов?
2. да, это именно то, что я искал, спасибо за дополнительную информацию