GästebuchIhr Eintrag in unser Gästebuch KontaktNehmen Sie Kontakt mit den Autoren auf ArchivAlle Unixwerk- Artikel seit 2003
20. September 2013

Tipp: Sortieren nach Versionsnummer

Eine Liste von Software-Produkten mit Versionsnummer soll sortiert werden. Dabei soll innerhalb eines Produkt die höchste Versionsnummer oben in der Liste stehen. Als Beispiel soll eine Datei  versions.txt  dienen, die wie folgt aussieht:

ITNM 7.1.0.3
ITNM 7.2.0.11
ITNM 7.2.0.0
ITNM 7.1.1.5
ITNM 6.1.0.0
Tivoli 4.4.1.1
Tivoli 4.4.1.2
Tivoli 4.4.1.11
Tivoli 4.2.1.1
Tivoli Manager 1.1.1.1
Tivoli Manager 1.1.1.2
Tivoli Manager 1.1.1.11
Tivoli Manager 1.21.1.1
Tivoli Manager 1.3.1.1
Network Manager 4.4.1.1
Network Manager 4.4.1.2
Network Manager 4.4.1.11
Network Manager 4.2.1.1

Am einfachsten geht dies, wenn man eine aktuelle Version der GNU-Coreutils, z.B. Version 8.19, installiert hat

$  sort -r -V versions.txt
Tivoli Manager 1.21.1.1
Tivoli Manager 1.3.1.1
Tivoli Manager 1.1.1.11
Tivoli Manager 1.1.1.2
Tivoli Manager 1.1.1.1
Tivoli 4.4.1.11
Tivoli 4.4.1.2
Tivoli 4.4.1.1
Tivoli 4.2.1.1
Network Manager 4.4.1.11
Network Manager 4.4.1.2
Network Manager 4.4.1.1
Network Manager 4.2.1.1
ITNM 7.2.0.11
ITNM 7.2.0.0
ITNM 7.1.1.5
ITNM 7.1.0.3
ITNM 6.1.0.0

Der Schalter  -r  wirkt hier auf alle Felder, so dass nicht nur die höchste Versionsnummer oben steht, sondern auch die Paketnamen alphabetisch von Z nach A sortiert werden. Ältere Versionen von  sort  verstehen überdies den Schalter  -V  nicht - das gleiche gilt für Versionen von  sort , die man auf proprietären UNIX-Derivaten findet.

Dennoch ist dies auch mit  sort-Bordmitteln erreichbar. Allerdings müssen wir dafür in der Datei  versions.txt  zwischen dem Paketnamen und der Versionsnummer noch einen Punkt(.) einfügen. ¹   Dies ist nötig, damit wir den Schalter  -t"."  nutzen können:

$  sort -t"." -k1,1 -k2,2nr -k3,3nr -k4,4nr -k5,5nr versions.txt
ITNM.7.2.0.11
ITNM.7.2.0.0
ITNM.7.1.1.5
ITNM.7.1.0.3
ITNM.6.1.0.0
Network Manager.4.4.1.11
Network Manager.4.4.1.2
Network Manager.4.4.1.1
Network Manager.4.2.1.1
Tivoli.4.4.1.11
Tivoli.4.4.1.2
Tivoli.4.4.1.1
Tivoli.4.2.1.1
Tivoli Manager.1.21.1.1
Tivoli Manager.1.3.1.1
Tivoli Manager.1.1.1.11
Tivoli Manager.1.1.1.2
Tivoli Manager.1.1.1.1

Diese Variante funktioniert mit den meisten Varianten von sort ², auch mit der GNU-Variante. Deshalb ist sie deutlich portabler. Sie hat zudem den Vorteil, dass die Softwarepakete weiterhin von A nach Z sortiert werden, während die höchste Versionsnummer aber oben steht. Hier wird der Schalter  -r  nämlich individuell auf jedes Feld angewandt.


¹ Dazu könnte man die Datei versions.txt zunächst mit sed bearbeiten und dann in das sort-Kommando fließen lassen: cat versions.txt | sed -e 's/\([A-Za-z]\) \([0-9]\)/\1\.\2/' | sort -t"." -k1,1 -k2,2nr -k3,3nr -k4,4nr -k5,5nr
² Getestet habe ich dies unter Linux und AIX. Es gibt aber durchaus Varianten von sort, z.B. ältere BSD-Varianten, mit denen auch diese portablere Version nicht funktioniert. Dazu gehört z.B. die sort-Variante, die mit BladeLogic kommt. Hier hatte ich aber Erfolg mit einer abgewandelten Version des Kommandos: sort -t"." -k1,1 -k2,2 -n -r -k3,3 -n -r -k4,4 -n -r -k5,5 -n -r versions.txt   Aber Achtung: Diese Variante klappt wiederum nicht unter GNU/Linux oder AIX - kann also nicht als portabel angesehen werden!