参考以下代码:
如何选择具有最高值的样本并输出整行。
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或命令行中执行此操作?
答案 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