in reply to Uniq and sort in perl
Utilitarian has given you a method of printing unique entries but if you also want to sort them then further steps will be required. Instead of printing in your while loop, declare an array outside of the loop and push your lines onto it inside the loop. You can then print your sorted unique lines afterwards. I use the inet_aton() from Socket to translate the IP numbers to a sortable string and use a Schwartzian Transform to do the sorting.
use strict; use warnings; use Socket; my @lines = split m{(?<=\n)}, <<EOD; ows301.dom.com, 10.157.118.42, oem300.dom.com, 10.157.124.58, omo300.dom.com, 10.157.124.58, pwd302.dom.com, 10.157.126.58, pwd302.dom.com, 10.157.126.58, pwd302.dom.com, 10.157.126.58, pwd302.dom.com, 10.157.126.58, pwd302.dom.com, 10.157.126.58, EOD print do { my %seen; map { $_->[ 0 ] } sort { $a->[ 2 ] cmp $b->[ 2 ] || $a->[ 1 ] cmp $b->[ 1 ] } map { my @flds = split m{,\s*}; [ $_, $flds[ 0 ], inet_aton( $flds[ 1 ] ) ] } grep { not $seen{ $_ } ++ } @lines };
The output.
ows301.dom.com, 10.157.118.42, oem300.dom.com, 10.157.124.58, omo300.dom.com, 10.157.124.58, pwd302.dom.com, 10.157.126.58,
I hope this is helpful.
Cheers,
JohnGG
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Uniq and sort in perl
by slayedbylucifer (Scribe) on Jul 12, 2012 at 09:56 UTC |