use strict; use warnings; use Data::Dump::Streamer; my %original = split " ", do { local $/; }; my %count; while ( my( $k, $v ) = each %original ) { $k =~ s/\A[^:]+:[^:]+:([^:]+).*/$1/; $count{$k}{$v}++; } my %summary; while ( my ($k, $v ) = each %count ) { my $max = [ sort { $v->{$b} <=> $v->{$a} } keys %$v]->[0]; $summary{$k} = $max; } Dump \%summary; __DATA__ Affy:HG_U133A:213119_at:74:303; ENSG00000123643 Affy:HG_U133A:213119_at:542:439; ENSG00000123643 Affy:HG_U133A:213119_at:658:369; ENSG00000123643 Affy:HG_U133A:213119_at:199:255; ENSG00000123643 Affy:HG_U133A:213119_at:436:453; ENSG00000123643 Affy:HG_U133A:213119_at:324:381; ENSG00000458158 Affy:HG_U133A:213118_at:584:557; ENSG00000123623 Affy:HG_U133A:213118_at:234:507; ENSG00000123623 Affy:HG_U133A:213118_at:482:429; ENSG00000123623 Affy:HG_U133A:213118_at:608:451; ENSG00000458158 Affy:HG_U133A:213118_at:356:297; ENSG00000123623 #### $HASH1 = { "213118_at" => 'ENSG00000123623', "213119_at" => 'ENSG00000123643' };