美文网首页
Perl学习16之生信分析中Perl简单运用(二)

Perl学习16之生信分析中Perl简单运用(二)

作者: pythonic生物人 | 来源:发表于2020-07-21 11:26 被阅读0次

1、计算一条DNA序列中的ATGC个数、GC含量并格式化输出
2、对每一行数据求和,每个数剧使用各自行和归一化
3、计算sam文件每个染色体匹配reads数,GC碱基数,GC含量
4、计算SAM文件中reads落在每个bin区间中的reads数目,GC碱基数目,GC比
首发于本人公众号:pythonic生物人


更好的阅读体验请戳:

Perl学习17之生信简单运用
Perl学习18之生信简单运用(二)
Perl学习19之生信简单运用(三)


1、计算一条DNA序列中的ATGC个数、GC含量并格式化输出

gccount_read.pl

#!/usr/bin/perl
use strict;
use warnings;
my $read = "AACAAACCCCTTTTCTCTATTAAAAAATACAAAATAGCTTAGCTGCGGCATAGTGGAGCACG";
my $G = ($read =~ s/G/G/g);#s为匹配表示匹配,($read =~ s/G/G/g)返回匹配次数个数
my $C = ($read =~ s/C/C/g);
my $A = ($read =~ s/A/A/g);
my $T = ($read =~ s/T/T/g);
my $total = $G + $C + $A +$T;
my $GC_P = ($G + $C)/$total;

#格式化输出printf
printf "\$G:%d\n\$C:%d\n\$A:%d\n\$T:%d\n\$total:%d\n\$GC_P:%.2f\n",($G,$C,$A,$T,$total,$GC_P);

#sprintf格式化不输出
my $result = sprintf("\$G:%d\n\$C:%d\n\$A:%d\n\$T:%d\n\$total:%d\n\$GC_P:%.2f\n",($G,$C,$A,$T,$total,$GC_P));

#输出到文件GC.file
open OUT,">","./GC.file";
print OUT $result;
close OUT;

perl gccount_read.pl
$G:10
$C:14
$A:23
$T:15
$total:62
$GC_P:0.39

cat GC.file
$G:10
$C:14
$A:23
$T:15
$total:62


2、对每一行数据求和,每个数剧使用各自行和归一化

输入文件
sumfile

a       1       2       3       4       5       6
b       1       2       3       4       5       6

目的:分别求a,b行中所有数之和,每个数在该行所占比例格式化输出
脚本:sum1.pl

#!/usr/bin/perl
use strict;
use warnings;

open IN,"./sumfile";
while(<IN>){
        chomp;
        my @t=split;
        my $sum=0;

        for my $i (1..5){
                $sum+=$t[$i];
        }
        print "$t[0]\t$sum\t";#求和

        for my $i (1..5){
                my $percent=$t[$i]/$sum;
                printf "%.2f\t","$percent";
        }
        print "\n";#换行

                  }
                  

perl sum1.pl
a 15 0.07 0.13 0.20 0.27 0.33
b 15 0.07 0.13 0.20 0.27 0.33


3、计算sam文件每个染色体匹配reads数,GC碱基数,GC含量

gccount_reads.pl

#!/usr/bin/perl
use strict;
use warnings;

my (%hash,%GC,%ATGC);
open IN,"<",$ARGV[0];
while(<IN>){
        chomp;
        next if /^@/;#跳过@开头的行
        my @line=split;
        next if $line[2] eq "*";#跳过未匹配上的序列
        next if $line[4] < 25;#排除比对质量小于25的序列

        #计算ATGC的碱基个数
        my $G = ($line[9] =~ s/G/G/g);
        my $C = ($line[9] =~ s/C/C/g);
        my $A = ($line[9] =~ s/A/A/g);
        my $T = ($line[9] =~ s/T/T/g);
        my $GC = $G + $C;
        #计算每个染色体匹配到的read数,GC碱基个数,总碱基个数
        $hash{$line[2]} ++;
        $GC{$line[2]} += $GC;
        $ATGC{$line[2]} += ($GC + $A + $T);
}
close IN;

foreach (keys %hash){
        printf "$_\t$hash{$_}\t$GC{$_}\t%.2f%%\n",($GC{$_}/$ATGC{$_})*100;

}

perl gccount_reads.pl *sam
chr7 108663 2212904 40.73%
chr20 44747 990732 44.28%
chr22 24434 586887 48.04%
chr14 63145 1293962 40.98%
chrY 1444 29104 40.31%
chr19 36744 881130 47.96%
chr8 102992 2080246 40.40%
chr1 162445 3403360 41.90%
chr11 94802 1984799 41.87%
。。。。。。。。。。。。。。。

4、计算SAM文件中reads落在每个bin区间中的reads数目,GC碱基数目,GC比

输入文件1:file1,kemr区间文件,按照1M每个bin区间

chr1 7000001
chr1 8000001
chr1 9000001
chr1 10000001
chr1 11000001
chr1 12000001
chr1 14000001
chr1 15000001
chr1 16000001
chr1 18000001
chr1 19000001
chr1 20000001

输入文件2:
file2,sam文件问题解决代码:reads_inbin.pl

#!/usr/bin/perl
use strict;
use warnings;

#存储每个bin的区间{chr1=>{1000001=>0,2000001>0.......}}
my (%bin,%GC,%ATGC);
open BIN,"<",$ARGV[0];
while(<BIN>){
        chomp;
        my @line = split /\t/;
        $bin{$line[0]}{$line[1]}=0;
}
close BIN;


open IN,"<",$ARGV[1];
while(<IN>){
        chomp;
        next if /^@/;
        my @line = split/\t/,$_;
        next if $line[2] eq "*";
        next if $line[4] < 25;
        #求每个bin区间例如,[1000001,1000001+1000000)上的reads数目
        #keys %{$hash{line[2]}}取出所有1000001,二维哈希的循环写法
        #foreach my $start (keys $bin{$line[2]}){#该写法报如下错误
        #Type of argument to keys on reference must be unblessed hashref or arrayref
        foreach my $s (sort keys %{$bin{$line[2]}}){
                if($line[3]>=$s && $line[3]<($s+1000000)){
                        $bin{$line[2]}{$s} ++;
                        my $G = ($line[9] =~ s/G/G/g);
                        my $C = ($line[9] =~ s/C/C/g);
                        my $A = ($line[9] =~ s/A/A/g);
                        my $T = ($line[9] =~ s/T/T/g);
                        $GC{$line[2]}{$s} += ($G + $C);
                        $ATGC{$line[2]}{$s} += ($G + $C + $A + $T);

                }
        }
}
close IN;

foreach (keys %bin){
        my $chr=$_;
        foreach (keys $bin{$chr}){
                printf "$chr\t$_\t$bin{$chr}{$_}\t$GC{$chr}{$_}\t$ATGC{$chr}{$_}\t%.2f%%\n",($GC{$chr}{$_}/$ATGC{$chr}{$_})*100;
        }
}

perl reads_inbin.pl file1 test.sam
chr7 131000001 790 17650 39500 44.68%
chr7 79000001 706 12653 35300 35.84%
chr7 36000001 710 15303 35500 43.11%
chr7 24000001 725 14647 36250 40.41%
chr7 97000001 681 14593 34050 42.86%
chr7 47000001 796 18134 39800 45.56%
chr7 64000001 512 10840 25600 42.34%
chr7 33000001 749 14887 37450 39.75%
chr7 19000001 652 12071 32600 37.03%
。。。。。。。。。。。。。。。。。。。


欢迎关注公众号!

干货,真香

相关文章

网友评论

      本文标题:Perl学习16之生信分析中Perl简单运用(二)

      本文链接:https://www.haomeiwen.com/subject/jrfukktx.html