jq как объединить несколько массивов?

#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] для доступа к данным по индексу. извините, я не эксперт в использовании jq

5. @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. да, это именно то, что я искал, спасибо за дополнительную информацию