Объединение нескольких вызовов jq для сортировки и ограничения содержимого потока объектов - PullRequest
1 голос
/ 06 июня 2019

У меня есть поток обновлений json для продуктов, и я пытаюсь отсортировать последние версии X по версии (в настоящее время они отсортированы по дате выпуска).

Похоже, что jq не может сортировать поток объектов напрямую, sort_by работает только с массивами, и я не смог найти способ собрать поток в массив, который не связан с передачей * От 1004 * до jq -s.

Мое текущее решение:

< xx \
    jq -c '.[] | select(.platform | contains("Unix"))' \
    | jq -cs 'sort_by(.version) | reverse | .[]' \
    | head -5 \
    | jq -C . \
    | less

Я ожидал, что смогу использовать

jq '.[] | select(...) | sort_by(.version) | limit(5) | reverse'

но я не смог найти вещь, которая limit s и sort_by не работает на не массивах.

Я тестирую это на json atlassian для релизов: https://my.atlassian.com/download/feeds/archived/bamboo.json

1 Ответ

1 голос
/ 06 июня 2019

В jq вы всегда можете поместить результаты в массив, используя [..], который помещает результаты в массив для последующих функций, с которыми нужно работать.Ваше заданное требование может быть просто выполнено как

jq '[.[] | select(.platform | contains("Unix"))] | sort_by(.version) | limit(5;.[])'

Посмотрите, как оно работает на jq площадка протестировано на v1.6

и с добавленной функцией reverse(), введитедругой уровень вложенности массива.Используйте reverse[], чтобы сбросить только объекты

jq '[[.[] | select(.platform | contains("Unix"))] | sort_by(.version) | limit(5;.[]) ] | reverse'
...