我有一个文件(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
有人可以指出代码有什么问题或建议另一种解决方案吗?
答案 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