#! perl -slw use strict; my @data = map{ chomp; [ split '\s*\|\s*', $_ ] } ; my @counts; for my $field ( 1 .. 3 ) { my $rank = 0; @data = map { $_->[ $field ] and $_->[ $field ] = ++$rank; $_; } sort { ( $a->[ $field ]||0 ) <=> ( $b->[ $field ]||0 ) } @data; $counts[ $field ] = $rank; } for my $data ( @data ) { map { $data->[ $_ ] and $data->[ $_ ] = sprintf '%5.3f', $data->[ $_ ] /= $counts[ $_ ]; } 1 .. 3; } print join "\t", @$_ for @data; __DATA__ ENSG00000179050 | | | 4 ENSG00000124183 | 237 | | 2 ENSG00000179033 | | | 7 ENSG00000124181 | | 13 | 1 ENSG00000174306 | | | 5 ENSG00000132793 | | | 8 ENSG00000183798 | | | 6 ENSG00000124177 | | | 3 ENSG00000087530 | 153 | | ENSG00000185513 | 258 | | ENSG00000101052 | 231 | | ENSG00000124249 | 154 | 7 | ENSG00000101098 | 159 | | ENSG00000166913 | 141 | | __OUTPUT__ P:\test>383173 ENSG00000166913 0.143 ENSG00000087530 0.286 ENSG00000101098 0.571 ENSG00000101052 0.714 ENSG00000185513 1.000 ENSG00000124249 0.429 0.500 ENSG00000124181 1.000 0.125 ENSG00000124183 0.857 0.250 ENSG00000124177 0.375 ENSG00000179050 0.500 ENSG00000174306 0.625 ENSG00000183798 0.750 ENSG00000179033 0.875 ENSG00000132793 1.000