Ok, fair enough.
If it can be determined exactly what the "version" string is, then I perhaps would use an algorithm like below. One pass through the data, no sorting. Use a hash table with a key of the "generic name" and value of the version. If the version is greater, then replace the hash value with the greater version.
Of course this can become very complex in the real world because version naming conventions vary widely.
However, I think this was a successful thread in that the main issues have been discussed and some techniques demo'd. I did this quickly and perhaps there are some minor point to quibble about. But I think the general idea of this approach is solid.
#!/usr/bin/perl
use warnings;
use strict;
my %versions;
while (my $line = <DATA>)
{
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
|