选择具有最高价值的线

时间:2014-06-27 17:53:45

标签: perl awk

参考以下代码:

如何选择具有最高值的样本并输出整行。

 Sample      Value      Sequence
 miR1        23213      atatgcgctcg
 miR1        324235     atatctcgct
 miR1        3453       tctgctcg
 miR2        343        tctctgag
 miR2        34535      tctct
 miR2        4324       tctgagag
 ...

输出:

 miR1        324235     atatctcgct
 miR2        34535      tctct

我想我可以在excel中进行一些排序,但有没有办法在perl或命令行中执行此操作?

6 个答案:

答案 0 :(得分:2)

perl -MList::Util=max -lane'
  $h{$F[0]}{$F[1]} = $_ }{
  print $h{$_}{ max keys %{$h{$_}} } for keys %h
' file

输出

 miR1        324235     atatctcgct
 miR2        34535      tctct

答案 1 :(得分:1)

这段代码会将您的输入文件拆分为\s+,并使用第一列作为哈希中的键,该键将获取该键的最大值,因为它是最终值:

use warnings;
use strict;
use Data::Dumper;
$Data::Dumper::Sortkeys = 1;

open my $in, '<', 'in.txt';

my (%data, @split, %keep);

while (<$in>){
    chomp;
    next if /^Sample/;
    s/^\s//;
    @split = split(/\s+/);
    if ( (not exists $data{$split[0]} ) || (abs $data{$split[0]} < abs $split[1] ) ) {
        $data{$split[0]} = $split[1];
        $keep{$split[0]} = [ $split[1], $split[2] ];                     
    }

}

print "$_\t@{$keep{$_}}\n" for sort keys %keep;

miR1    324235 atatctcgct
miR2    34535 tctct

答案 2 :(得分:1)

awk解决方案:

awk 'NR>1{ if (a[$1]<$2) {a[$1]=$2;b[a[$1]]=$0} else a[$1]} END {for (i in a) print b[a[i]]}' file
 miR1        324235     atatctcgct
 miR2        34535      tctct

答案 3 :(得分:1)

另一个perl单行:

perl -lane '
push @{$h{$F[0]}}, [$F[1], $_] }{ 
print $_->[1] for map { (sort { $b->[0] <=> $a->[0] } @$_)[0] } values %h' file

输出

 miR2        34535      tctct
 miR1        324235     atatctcgct

答案 4 :(得分:0)

你可以使用sort,

$ sort -k 2,2n file | tac | head -2
 miR1        324235     atatctcgct
 miR2        34535      tctct

答案 5 :(得分:0)

下面的awk命令只会给出最大值的行。

 awk 'BEGIN {IFS= "[ ]*";maxVal=1 } NR>1{ if(maxVal < $2) maxVal = $0 } END {print maxVal  }'  inputFile.txt

输出:

miR1   23213   atatgcgctcg