LINUX.ORG.RU

Вычленение из списка старшей/предыдущей версии

 , ,


0

1

Привет. Допустим есть список пакетов, который формируется исходя из схемы имя-пакета-версия.программы-версиясборки:

kernel-modules-5.4.54-1
kernel-modules-5.4.55-1
kernel-modules-5.4.55-2
kernel-modules-5.4.58-1
kernel-modules-5.4.59-1
kernel-modules-5.4.61-1
kernel-modules-5.4.61-2

Хочу добиться двух простых целей: возможности находить среди списка разных пакетов разных версий последнюю версию для установки и предыдущую версию для даунгрейда. Думаю, каким образом это реализовать. Как вариант, разбивать на колонки на awk с разделителем - с конца, вроде

awk -F "-" '{build=$NF; ver=$(NF-1); print ver, build}' pkg-list

Вычленив эти колонки можно определить при помощи простой сортировки последнюю и предпоследнюю версию. Но как отсеить группы пакетов по остальной части названия, чтобы сравнивать версии и билды только внутри этой группы? Знаю, что в awk есть массивы, которые можно заполнить простой конкатенацией с переносом строки awk -F- '{!a[$N]++}', но в моем случае я не представляю как его применить, потому что количество столбцов при использовании - не только как разделителя, но и как элемента названия пакета, заранее неизвестно. Как можно заполнять массив, если заранее известны только те столбцы, которые точно не войдут туда для сравнения имени пакета ($NF и $(NF-1))? Может быть есть готовые тулзы для решения таких задач или более простые пути?


Ответ на: комментарий от PunkoIvan

А можно попродробнее, каким образом этот скрипт решает мою проблему? Я не ставил вопрос о том, как версии сравнивать. Я ставлю другой вопрос

Хочу добиться двух простых целей: возможности находить среди списка разных пакетов разных версий последнюю версию для установки и предыдущую версию для даунгрейда

Как можно заполнять массив, если заранее известны только те столбцы, которые точно не войдут туда для сравнения имени пакета ($NF и $(NF-1))?

Как сравнить билды и версии я описал выше. Для меня это не проблема.

SLRi
() автор топика

Предполагая, что список пактов находится в файле package.list, число уникальных названий пакетов (без версий и релизов) не слишком велико (не слишком — это значит поместится в переменную окружения), а сами записи имеют вид имя-X.Y.Z-R без расширения, где X, Y, Z и R — любые десятичные числа без букв и пр. символов, следующий скрипт

for i in $(cat package.list | sed 's/-[0-9]*\.[0-9]*\.[0-9]*-[0-9]*//' | sort | uniq);
  do
    grep "^$i-[0-9]*\.[0-9]*\.[0-9]*-[0-9]*\$" < package.list | sort -rn | head -n2;
  done

выведет в стандартный вывод все пакеты последней и предпоследней версий.

aureliano15 ★★
()
Последнее исправление: aureliano15 (всего исправлений: 1)

Ты уже скармливал этому пакеты явы, которые благодаря несовместимости её самой с собой, обычно называются «блабла-1.8.0»-и-только-тут-версия

DonkeyHot ★★★★★
()
Ответ на: комментарий от aureliano15

Немного причесал твой алгоритм

for PKG in $(sed 's/-[0-9]*\.[0-9]*\.[0-9]*-[0-9]*//' package.list | sort -u); do
  grep "^$PKG-[0-9]*\.[0-9]*\.[0-9]*-[0-9]*\$" package.list | sort -rn | head -2
done

За способ работы с sed спасибо, я в нем не очень силен. Хотя я и не просил готовое решение, я воспользуюсь твоим, чтобы адаптировать под мою задачу. Но работает алгоритм несовсем корректно. Он фейлится, если в списке две одинаковых последних версии пакета, но с разным билдом. На этом месте скрипт выдает (с учетом алгоритма логично) обе последних версии, но разные билды, вместо последней версии с последним билдом и предпоследней версии. Доработаю его в ближайшее время и выложу, если кому интересно будет.

Если у кого еще мысли есть по упрощению этих костылей, велком в топик. Мне казалось что задача достаточно распространенная, но готовых инструментов не нашел. Хотя можно поковырять какие-нибудь пакетные менеджеры, где есть похожие функции, но что-то мне подсказывает, что без пол-литра не разберусь…

SLRi
() автор топика
Ответ на: комментарий от DonkeyHot

У меня нет похожих случаев. И явы тоже нету. Все пакеты, которые нужны, именованы в соответствии с коцепцией из ОП.

SLRi
() автор топика
Ответ на: комментарий от SLRi

фейлится, если в списке две одинаковых последних версии пакета, но с разным билдом.

Тогда выложи часть реального списка, на которой фейлится.

aureliano15 ★★
()
Ответ на: комментарий от SLRi

А, релиз после дефиса не надо учитывать? Но брать самый последний? Так? Если да, то можно вложить ещё один цикл:

for PKG in $(cat package.list | sed 's/-[0-9]*\.[0-9]*\.[0-9]*-[0-9]*$//' | sort -u);
  do
    for VER in $(grep "^$PKG-[0-9]*\.[0-9]*\.[0-9]*-[0-9]*\$" < package.list | sed 's/-[0-9]*$//' | sort -rn | uniq | head -n2);
      do
         grep "^$VER-[0-9]*$" < package.list | sort -rn | head -n1;
      done
  done

Но тут уже нужен uniq. Не знаю почему, но sort с сочетанием опций -rnu работать как надо не хочет.

aureliano15 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.