Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
shell : trier une liste de paquets sur des numéros de version
Envoyé par: oudoubah

J'ai un fichier contenant une liste de rpm :
kernel-2.6.9-42.0.10.EL.rpm
kernel-2.6.9-42.0.2.EL.rpm
kernel-2.6.9-42.0.3.EL.rpm
kernel-2.6.9-42.0.8.EL.rpm
kernel-2.6.9-42.EL.rpm
kernel-2.6.9-5.0.3.EL.rpm
kernel-2.6.9-5.0.5.EL.rpm
kernel-2.6.9-55.0.2.EL.rpm
kernel-2.6.9-55.0.6.EL.rpm
kernel-2.6.9-55.0.9.EL.rpm
kernel-2.6.9-55.EL.rpm
ImageMagick-6.0.7.1-10.rpm
ImageMagick-6.0.7.1-11.rpm
ImageMagick-6.0.7.1-12.rpm
ImageMagick-6.0.7.1-14.rpm
ImageMagick-6.0.7.1-16.0.3.rpm
ImageMagick-6.0.7.1-16.rpm
ImageMagick-6.0.7.1-17.rpm
ImageMagick-6.0.7.1-6.rpm
HelixPlayer-1.0.3-1.rpm
HelixPlayer-1.0.4-1.1.EL4.2.rpm
HelixPlayer-1.0.5-0.EL4.1.rpm
HelixPlayer-1.0.6-0.EL4.1.rpm
HelixPlayer-1.0.6-0.EL4.2.0.2.rpm

Mon but, est de ne sélectionner que la dernière version de chaque rpm (donc kernel-2.6.9-55.0.9.EL.rpm, ImageMagick-6.0.7.1-17.rpm, HelixPlayer-1.0.6-0.EL4.2.0.2.rpm)

Après quelques tests, la commande sort ne semble pas trier les différentes versions comme je le souhaite.

Ce que j'essaye de faire, c'est de séparer le nom du rpm et son numéro de version (ça, c'est bon), de pouvoir scripter moi-même la comparaison (ça c'est faisable), et d'affecter le contenu dans des variables.

Le script que j'ai fait :
#!/bin/sh

for paquet in $(cat liste) ; do
        paquet=$(echo $paquet | sed -r 's;(\-[0-9].*); \1;' )
        nom="rpm_$(echo $paquet | cut -d' ' -f 1)"
        version=$(echo $paquet | cut -d' ' -f 2)
        if [ "${!nom}" == "" ] ; then
                ${nom}="$version"
        fi
        echo $nom : ${!nom}
done

En gras, j'ai mis ce qui pose problème. Je pourrais éventuellement passer par des tableaux, mais j'ai l'impression que ce sera lourd (un tableau de nom rpms à mettre en correspondance avec un tableau de versions, et vérifier à chaque fois si le rpm est déjà connu ou pas).

Est-ce qu'il y a une solution légère à mettre en oeuvre en shell, ou est-ce qu'un script pur awk ne serait pas plus efficace?

Poste le Wednesday 31 October 2007 11:12:49
Répondre     Citer    
Re: shell : trier une liste de paquets sur des numéros de version
Envoyé par: oudoubah

Bon, j'ai trouvé ça comme solution :
#!/usr/bin/awk -f

{
        paquet=$0
        sub(/-[0-9]/," &" , paquet)
        split(paquet,datapaquet," ")
        nom=datapaquet[1]
        version=datapaquet[2]
        if (versionpaquet[nom] == "" )
                versionpaquet[nom]=version
        else {
                versionref=versionpaquet[nom]
                versionnew=version
                gsub(/[\._\-]/," ",versionref)
                gsub(/[\._\-]/," ",versionnew)

                split(versionref, versionnumref, " ")
                split(versionnew, versionnumnew, " ")

                i=0
                while ( versionnumref == versionnumnew )
                        i++

                if (versionnumnew > versionnumref && versionnumnew < "A")
                        versionpaquet[nom]=version
        }
}

END {
        for (paquet in versionpaquet)
                printf("%s%s\n", paquet, versionpaquet[paquet])
}

Si quelqu'un a des idées pour le faire facilement en shell ou améliorer mon code awk, c'est à vous!

Tu as lu les docs. Tu es devenu un informaticien. Que tu le veuilles
ou non. Lire la doc, c'est le Premier et Unique Commandement de
l'informaticien.
-+- TP in: Guide du Linuxien pervers - "L'évangile selon St Thomas"

Poste le Wednesday 31 October 2007 14:04:35
Répondre     Citer    
Re: shell : trier une liste de paquets sur des numéros de version

Plutôt que faire des cut et des seds dans tous les sens pourquoi ne pas utiliser tout bêtement queryformat

rpm -qp --queryformat '%{NAME}--%{VERSION}--%{RELEASE}\n' fichier.rpm

--
Brugmans Frédéric

[www.brugmans.net]
[triathlon.sport-challenge.be]

Poste le Tuesday 6 November 2007 16:28:17
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
shell : trier une liste de paquets sur des numéros de version
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons