滑窗统计单位区间内的XX数目

#!/usr/bin/perl

use strict;

use warnings;

if(@ARGV != 3){

    die "Usage: perl $0 <input_file> <window_size> <step>\n";

}

my ($file, $win_size, $step) = @ARGV;

my $chr_col = 0; 

my $start_col = 1;

my $end_col = 2;   

my %chr_qtls;

open(my $fh, "<", $file) or die "Cannot open $file: $!";

<$fh>;  # 跳过表头

while(<$fh>){

    chomp;

    next if $_ eq '';

    my @f = split(/\t/);

    push @{$chr_qtls{$f[$chr_col]}}, [$f[$start_col], $f[$end_col]];

}

close $fh;

foreach my $chr (sort keys %chr_qtls){

    my $max_pos = 0;

    foreach my $qtl (@{$chr_qtls{$chr}}){

        $max_pos = $qtl->[1] if $qtl->[1] > $max_pos;

    }


    for(my $win_start = 0; $win_start <= $max_pos; $win_start += $step){

        my $win_end = $win_start + $win_size - 1;

        my $count = 0;

        foreach my $qtl (@{$chr_qtls{$chr}}){

            if($qtl->[0] <= $win_end && $qtl->[1] >= $win_start){

                $count++;

            }

        }

        print join("\t", $chr, $win_start, $win_end, $count), "\n";

    }

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容