как фильтровать результаты массива и среза с помощью jq - PullRequest
0 голосов
/ 07 мая 2019

Предположим, у меня есть следующие данные:

{
   "dashboards": [
     {
       "name": "first",
       "type": "standard"
     },
     {
       "name": "second",
       "type": "custom"
     }
   ]
}

(на самом деле данных гораздо больше, я просто показываю, какова структура данных)

Я пытаюсь получить первые 10 панелей типа standard.

Я знаю, что могу получить все панели инструментов standard с: jq '.dashboards[] | select(.type == "standard")'

Но я не могу понять, как нарезать результирующий массив ...

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Если вы хотите получить результат в виде массива, вероятно, лучше использовать map:

.dashboards | map(select(.type=="standard")) | .[0:10]

Если вы хотите, чтобы элементы были в виде потока, вы можете использовать встроенную функцию limitНапример,

limit(10; .dashboards[] | select(.type=="standard"))
0 голосов
/ 09 мая 2019

Вот альтернативный подход с использованием Unix-утилиты, основанной на дорожке пути. jtc:

- Я взял на себя смелость, добавив в исходные примеры JSON еще 4 "type": "standard" записи, но отобразив только первые 3 (для демонстрации):

bash $ <file.json jtc -r
{ "dashboards": [ { "name": "first", "type": "standard" }, { "name": "second", "type": "custom" }, { "name": "second", "type": "standard" }, { "name": "third", "type": "standard" }, { "name": "fifth", "type": "standard" } ] }
bash $ 
bash $ 
bash $ <file.json jtc -w'[type]:<standard>:3 [-1]'
{
   "name": "first",
   "type": "standard"
}
{
   "name": "second",
   "type": "standard"
}
{
   "name": "third",
   "type": "standard"
}
bash $ 

PS> Раскрытие информации: я создатель jtc инструмента

...