找到每行中的最大值,返回最大值的行ID和列标题

时间:2015-04-28 03:22:40

标签: perl

我有一个文件(19,000行和200列),如下所示:

<a ng-link="statOrders()"/>

我想找到每一行的最大值,并打印找到最大值的列的最大值,行ID和列标题。输出看起来像:

GENE CLM-MXL-ACB_PBS CLM-PEL-ACB_PBS CLM-PUR-ACB_PBS 
A1BG 2.927682 2.935334 -0.262044
A1CF -0.503390 -0.193219 0.038984
A2M -0.217628 -0.264332 -0.380048
A2ML1 -0.040747 0.566124 0.935753

我有一个不起作用的perl脚本:

 A1BG CLM-PEL-ACB_PBS 2.935334
 A1CF CLM-PUR-ACB_PBS 0.038984
 A2M CLM-MXL-ACB_PBS -0.217628
 A2ML1 CLM-PUR-ACB_PBS 0.935753

有人可以指出代码有什么问题或建议另一种解决方案吗?

1 个答案:

答案 0 :(得分:2)

我要做的是,首先保存标题,以便稍后我可以吐出列名。然后,遍历每一行,按标题名称保存每个字段,然后查找最大数字(通常我使用List :: Util :: max,但我需要带有最大数字的密钥,而不是最大数字本身,所以我用List :: Util :: reduce伪造它。然后我可以吐出已发现的最大值。为了节省一些工作量,我将数据放入内联,但您也可以从任意文件中读取数据。 (但是,我会使用open my $in, '<', $F or die "Can't read from $F: $!"代替您的开放语句,以便更好地检测和处理错误。)

#!/opt/myperl/5.20.2/bin/perl

use 5.10.0;
use List::Util qw(reduce);

my @header = do {
    my $line = <DATA>;
    split ' ', $line;
};

while (<DATA>)
{
    my @fields = split ' ', $_;
    my %data; @data{@header} = @fields;

    my $max_key = reduce { $data{$a} > $data{$b} ? $a : $b } @header[1..$#header];

    say join ' ', $data{$header[0]}, $max_key, $data{$max_key};
}


__END__
GENE CLM-MXL-ACB_PBS CLM-PEL-ACB_PBS CLM-PUR-ACB_PBS 
A1BG 2.927682 2.935334 -0.262044
A1CF -0.503390 -0.193219 0.038984
A2M -0.217628 -0.264332 -0.380048
A2ML1 -0.040747 0.566124 0.935753