- 论坛徽章:
- 5
|
本帖最后由 pitonas 于 2014-08-16 05:32 编辑
这个问题, 我不放弃 ~ {:2_172:}
基本完成
~ {:2_168:}
- 使用猫 (cat)
- 我不知道 flag 这个计算规则,所以我用我的规则
- 在第 40 行有一个错误
- #!/usr/bin/perl -w
- use 5.010;
- my @txt = qw/1.txt 2.txt/; # glob or ...
- my @tmp = map { "$_.tmp" } @txt; # tmp files
- my ( $fh, @fh ) = map { open my $f, '<', $_; $f } @txt;
- my @write_fh = map { open my $f, '>', $_; $f } @tmp;
- my ( $CHR, $BEGIN );
- while (<$fh>) {
- ( $CHR, $BEGIN ) = (split)[ 3, 4 ];
- my @pos = [ split /\s/, <$fh> ];
- my $index = $#{ $pos[0] };
- for my $f (@fh) {
- readline $f;
- push @pos, [ split /\s/, <$f> ];
- }
- my @ave = map {
- my ( $i, $sum ) = $_;
- $sum += $pos[$_][$i] for 0 .. $#pos;
- $sum / @pos;
- } 0 .. $#{ $pos[0] };
- for my $i ( 0 .. $#pos ) {
- my @flag = map {
- my $F = $pos[$i][$_] / ( $ave[$_] || 1 );
- [ $F = $F <= 0.3 ? 0 : $F > 0.6 ? 2 : 1, 1 ];
- } 0 .. $index;
- separate( $i, @flag );
- }
- }
- sub separate {
- my $index = shift;
- my @flag = ( [], [], [] );
- for my $f ( 1 .. 3 ) {
- for ( my $i = 0 ; $i <= $#_ - 4 ; $i++ ) {
- next if $_[$i][0] ne $f;
- $i += 7 and next if !$_[ $i + 2 ][1];
- my $end = $i + 4;
- my $zero = 0;
- for my $x ( reverse $end - 1 .. $end ) {
- $_[$x][1] ? last : $zero++;
- }
- my $count = grep { $_[$_][0] == $f } $i .. $end - $zero;
- next if $count < 3;
- @{ $_[$_] } = ( $f, 0 ) for $i .. $end - $zero;
- $i += 4 + $zero ? 5 - $zero : 0;
- }
- }
- for my $i ( 0 .. $#_ ) {
- !$flag[ $_[$i][0] ][0] || ( $i - $flag[ $_[$i][0] ][-1][-1] != 1 )
- ? push @{ $flag[ $_[$i][0] ] }, [$i]
- : ( $flag[ $_[$i][0] ][-1][1] = $i );
- }
- my $i;
- for my $f (@flag) {
- $i++;
- for my $range (@$f) {
- @$range <= 1 || $range->[1] - $range->[0] < 2 and next;
- my $range = join '-', map { $_ + $BEGIN } @$range;
- say { $write_fh[$index] } "$txt[$index]\t$CHR\t$range\tf$i";
- }
- }
- }
- close $_ for @write_fh;
- `cat @tmp > result.txt`; # cat
- __DATA__
- ~ 0.3
- 0.3 ~ 0.6
- 0.6 ~
复制代码 |
|