use strict; use warnings; use Socket; my @lines = split m{(?<=\n)}, <[ 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 }; #### 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,