Подберите последние выпуски из каждой основной версии узла с помощью jq. - PullRequest
0 голосов
/ 21 мая 2018

Есть ли какие-нибудь умные способы, чтобы выбрать последние выпуски из каждой основной версии узла с jq?Или мне нужно написать другой скрипт оболочки для обработки его вывода?

Что я хочу получить (есть три основные версии: v8, v9 и v10), последние версии:

v10.1.0
v9.11.1
v8.11.2

Список релизов:

$ export repo='nodejs/node'
$ curl -s https://api.github.com/repos/${repo}/tags |jq -r ".[].name"
v10.1.0
v10.0.0
v9.11.1
v9.11.0
v9.10.1
v9.10.0
v9.9.0
v9.8.0
v9.7.1
v9.7.0
v9.6.1
v9.6.0
v9.5.0
v9.4.0
v9.3.0
v9.2.1
v9.2.0
v9.1.0
v9.0.0
v8.11.2
v8.11.1
v8.11.0
v8.10.0
v8.9.4
v8.9.3
v8.9.2
v8.9.1
v8.9.0
v8.8.1
v8.8.0

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Если вы перенаправили вывод curl в jq -r с помощью следующего фильтра, вы должны получить основные версии, независимо от того, как упорядочены номера версий в результатах curl:

map(.name)
| map(split(".") | map(tonumber? // .) )
| group_by(.[0])
| map(sort)
| map( .[-1] | map(tostring) | join("."))
| .[]

Variation

Если вы хотите, чтобы выходные данные также были отсортированы, просто удалите «v» заранее, а затем закрепите его.В интересах общности давайте определим функцию, которая будет выводить тег самого последнего выпуска для каждого основного выпуска:

# Input: an array of "x.y.z..." strings, 
# some or all components of which may be integers
# Output: a stream of the latest "major" releases
def majors:
  map( split(".") | map(tonumber? // .))
  | group_by(.[0])
  | map(sort[-1])[]
  | map(tostring)
  | join(".") ;

map( .name[1:] ) | "v" + majors

Typescript

$ jq -rf major-version.jq input.json
v8.11.2
v9.11.1
v10.1.0
0 голосов
/ 21 мая 2018

Вы могли бы передать эту команду awk:

awk -F. '!major[$1]++'

Она использует точку в качестве разделителя полей и печатает каждую строку, в которой никогда не видела первое поле, которое является основной версией.

В случае, если входные данные не отсортированы, и у вас есть сортировка GNU, вы можете использовать ее сортировку по версии:

sort -rV | awk -F. '!major[$1]++'

, где -V для "сортировки по версии" и -r для "реверс».

...