- 论坛徽章:
- 8
|
30可用积分
本帖最后由 huang6894 于 2014-06-20 10:51 编辑
在一个perl脚本中,我使用:
- open DATA,"> $outdir/tmp.data" or die "$!";
- print DATA "$tran\t$chr\t$pos1\t$pos2\t$genename\t$ave\n";
- close DATA;
- open DATA,"< $outdir/tmp.data" or die "$!";
- ###其实我是觉得这样写挺傻的,又读又写。。。之前是用一个hash数组存放,对其key值(第六列)排序,可是不知道怎么分开相同key值的两条记录。。。push的时候把他们当做一个数组里面两个元素了。。。。
- open OUT,"> $outdir/result.data" or die "$!";
- my @all = sort { $b->[-1] <=> $a->[-1] } map [split], <DATA>;
- my $five = 5 * $#all / 100;
- my $FIVE = int $five;
- $five = $five != $FIVE ? ( $FIVE + 1 ) : $FIVE;
- my @ok = ( [ 0 .. $five - 1 ], [ -$five .. -1 ] );
- for my $i ( $five .. $#all ) {
- $all[ $ok[0][-1] ][-1] == $all[$i][-1]
- ? push @{ $ok[0] }, $i
- : last;
- }
- for my $i ( ( $five + 1 ) .. $#all ) {
- $all[ $ok[-1][0] ][-1] == $all[ -$i ][-1]
- ? unshift @{ $ok[1] }, -$i
- : last;
- }
- print OUT join( "\t", @{ $all[$_] } ), $/ for map @$_, @ok;
- close DATA;
- close OUT;
-
复制代码 以上使用的是@rubyish大神的代码
得到类似于:- NM_000402.3 chrX 153759606 153775233 G6PD 66.5543754674645
- NM_001042351.1 chrX 153759606 153775787 G6PD 66.5543754674645
- NM_000027.3 chr4 178351929 178363657 AGA 0.994475138121547
复制代码 真实情况是,@{$file{$k}}存放了几十万条记录,我只想知道$k大小在前5%和后5%的那些条目…
希望结果是:- NM_000402.3 chrX 153759606 153775233 G6PD 66.5543754674645 max
- NM_001042351.1 chrX 153759606 153775787 G6PD 66.5543754674645 max
- NM_000027.3 chr4 178351929 178363657 AGA 0.994475138121547 min
复制代码 ***************************************************************************************************
4楼@rubyish大神的代码帮了我大忙,谢谢大神的帮忙,非常感谢@q1208c指出题目的错误,感谢@laputa73大神提供的思路。。。
**************************************************************************************************
我是想对第六列进行排序,如果大小在前5%(向上取整)和后5%(向上取整)的条目,输出该行(min/max),可是对于大数据还是挺慢的,请教一下大神,应该怎么优化呢?
|
|