#!/usr/bin/perl use warnings; use strict; my %versions; while (my $line = ) { next if $line =~ /^\s*$/; #skip blank lines $line =~ s/\s*$//; my ($name, $version, $platform) = $line =~ /^([a-zA-Z-]+)-([\d\._-]+)\.(.*)$/; # set a default value if needed. $versions{"$name:$platform"} //= "0.0.0-0"; if (cmp_verA2B ($versions{"$name:$platform"}, $version)<0) { $versions{"$name:$platform"} = $version; } } foreach my $version (sort keys %versions) #print results { my $max_ver = $versions{$version}; my ($prefix,$suffix) =split ':', $version; print "$prefix\-$max_ver\.$suffix\n"; } sub cmp_verA2B { my ($verA, $verB) = @_; my ($majorA,$minorA,$subVerA) = split /\./,$verA; my ($majorB,$minorB,$subVerB) = split /\./,$verB; my ($subVerA1, $subVerA2) = split ('-',$subVerA); my ($subVerB1, $subVerB2) = split ('-',$subVerB); $majorA <=> $majorB or $minorA <=> $minorB or $subVerA1 <=> $subVerB1 or $subVerA2 <=> $subVerB2 } =Prints: abc-4.2.11-8.el7_2.x86_64 samba-common-libs-4.2.12-7.el7_2.x86_64 xyz-libs-4.2.13-7.el7_2.x86_64 =cut __DATA__ samba-common-libs-4.2.12-7.el7_2.x86_64 samba-common-libs-4.2.10-3.el7_2.x86_64 xyz-libs-4.2.10-7.el7_2.x86_64 samba-common-libs-4.2.10-6.el7_2.x86_64 abc-4.2.11-7.el7_2.x86_64 xyz-libs-4.2.11-7.el7_2.x86_64 abc-4.2.11-8.el7_2.x86_64 samba-common-libs-4.2.10-6.2.el7_2.x86_64 xyz-libs-4.2.12-7.el7_2.x86_64 xyz-libs-4.2.13-7.el7_2.x86_64 samba-common-libs-4.2.10-8.el7_2.x86_64