perl实战-合并两个列相同的文件

目的:两文件第一列ID相同。不同的是第二列。
现把两文件合并为一个
a.txt

Seq     Length
cog4    210
cog2    94
cog3    210
cog1    113
cog5    152

b.txt

Seq     Depth
cog5    93
cog1    110
cog2    114
cog4    91
cog3    111

思路·把一个文件的内容存为hash。另一个文件的id去遍历,打印这个hash

perl xx.pl a.txt b.txt
#!/usr/bin/perl
open F1,"$ARGV[0]";
open F2,"$ARGV[1]";
while (){
        chomp;
        @a = split /\s+/,$_;
        $hash{$a[0]} = $a[1];
}
while (){
        chomp;
        @b = split /\s+/,$_;
        print "$b[0]\t$b[1]\t$hash{$b[0]}\n";
}

close F1;
close F2;

--------------分割线-------------------------------------------------------
目的:求fastq文件的cg含量
fastq文件

@SRR1916134.1 SN608_VA044:1:1101:76.30:96.10 length=100
NATATTAATATAAGATTTTAAATTATAATTATATATTATTAATTTTTTATTAATATTATTTGGTTGAATATAATTTTTATTTGTTTTTGGATAAATATTA
+SRR1916134.1 SN608_VA044:1:1101:76.30:96.10 length=100
!11=BBBDDA2AD@EEIIDB?F.7@C=)7=CDD/7;A@6;AB;>
@SRR1916134.2 SN608_VA044:1:1101:96.30:99.20 length=100
NGAGTTTTGGTTATGGGAGTTGGAATTTTGAAAGGAGAATTAATAAATTATTATAATTTTTTTTATATAAAAATATAAATATATTTATTAATAATTATAT
+SRR1916134.2 SN608_VA044:1:1101:96.30:99.20 length=100
!11A=BDDFF@>A@
@SRR1916134.3 SN608_VA044:1:1101:107.00:97.40 length=100
NAATAATATAATAAAAAATAAAATATTTATTATTATTATAAAAATAAGTTATAATATAAAAATATTAATTATTTATTTATTTATTTATTTTATAAAAAAA
+SRR1916134.3 SN608_VA044:1:1101:107.00:97.40 length=100

脚本

#!/usr/bin/perl

open IN,"$ARGV[0]";
while (){
       chomp;
       if (/@/){
       @a = split /\t/,$_;
       $a[0]=~s/@//g;
       print "$a[0]\n"; 
  }elsif(/^[ATCGN]/){
     $G = ($_ =~ tr/Gg//);
     $C = ($_ =~ tr/Cc//);
     $num = ($G+$C)/length($_);
     print "$_\n$num\n";
  }
}
close IN;

目的:
输入文件 为test.fa如下,以第一条序列为例>ENSRNOT00000000957 gene=F1M7K0_RATCDS=1-1104 依次为基因ID、名称、编码区位置以下为碱基序列

1、将序列读入哈希变量%gene_fasta(建议 key为“基因ID” value为“碱基序列”)

2、输出第一条(ENSRNOT00000000957)序列的反向互补序列

3、输出表格依次为基因ID、名称、编码区起始位、编码区终止位,部分表格如下

4、查找其中最长的序列,输出ID编号,与碱基信息

5、统计长度在200~500之间的序列,并按长度排序输出 ID 和长度部分表格如下

例子:

>scaffold1_orf00001 gene=F1M7K0_RAT1 CDS=1-30
GTGTCAGCGCCACATACNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGGT
TTTGCGCGGCCACCTGA
>scaffold1_orf00003 gene=F1M7K0_RAT2 CDS=3-30
ATGAACCTGGCGACGTGGGCGGAGCGCAACGGTGTTGCTCCGGGGACCGC
CTACCGCTGGTTTCGTGCTGGTCTGTTGTCGGTGATGGCGAGGCGAGTGG
GCCGACTGATTCTCGTCGACGAACCGGCTGGGGACGCTGGCATGCGATCA
CCGACCGCGGTGTATGCACGGGTGTCGTCGGCCGATCAGAAAGCCGATCT
GGATCGGCAGGTCGCGCGGGTGACCGCGTGGGCCACGGCCCAACAGATGC
CAGTCGACAAGGTCGTGACCGAGGTCGGTTCCGCGTTCAACGAGCACCGC
CGTAAGTTCCTTTCACTGCTGCGCGACCCGTCAGTCCACCGGATCGTGGT
GGAGCACCGGGATCGGTTCTGCCGGTTGGGCTCGAAGTACGTGCAGGCAG
CGTTTGCGGCGCAGGGCCGCGAACTGGTGGTAGTCGACTCTGCCGAGGTC
GATGACGACCTGGTGCGGGATATGACCGAGATCCTGACGTCGATGTGCGC
CCGTCTGTATGGCAAACGGGCTGCCGAGAATCGAACCAAGCGCGCATTGG
CGGCCGCTGCTGGCGAGGACCATGAGGCCGCCTGA
>scaffold1_orf00004 gene=F1M7K0_RAT3 CDS=8-40
ATGCCCAAGTTCGAGGTTCCCGATGGCTGGACGGTCCAAGCGTTTCGGTT
CACGCTGGACCCGACCGAGGACCAGGCCAAGGCGCTGGCACGGCATTTCG
GTGCTCGTCGCAAGGCATACAACTGGACCGTGGCCACCCTGAAAGCCGAC
ATCCAGGCGTGGCATGCCAGCGGGACCGTGACAGCGAAACCGTCGCTGCG
CGTGCTGCGCAAACGCTGGAACACCGTCAAGGACGACGTGTGCGTCAACA
CCGAGACCGGTGTCGCGTGGTGGCCTGAATGCTCAAAAGAGGCCTACGCC
GATGGCATCGCGGGTGCGGTCGAGGCGTACTGGAACTGGCAGACCTCCCG
CGCCGGCAAACGCGCCGGTAAACGGGTCGGGTTTCCCCGTTTCAAACGCA
AAGGCCGCGACCAGGATCGAGTGTCGTTCACGACCGGAGCGATGCGTGTG
GAACCCGACCGCCGTCACCTCACCCTGCCGGTCATCGGGACCGTCCGCAC
GCACGAGAACACCCGCCGTATCGAACGCCTGATCAAGGCCGGTCGGGCGC
GAGTATTGGCGATCTCGGTGCGCCGCAACGGCACTCGTCTGGATGCCAGT
GTGCGGGTGCTTGTCCAGCGTCCGCAGCAGCCGAAGGTGGTGCACCCCGG
TTCGCGGGTTGGTGTCGATGTCGGGGTCCGGCGCCTGGCGACGGTCGCCA
CCGCTGACGGCACGGCGATCGAGCAGGTTGAGAACCCACGACCGCTCGGC
GCCGCGCTGCGCGAGCTACGCCACGTGTGCCGGGCCCGTTCGCGTTGCAC
GAAAGGTTCACGGCGCTACCGTGAGCGCACCACTCAGATTTCCCGGTTGC
ATCGCCGGGTCAACGATGTCCGCACCCATCACCTGCACGTCCTGACGACA
CGGTTGGCTCAAACCCACGGCCGCATTGTTGTCGAAGGCTTGGACGCGAC
AGAGATGTTGCGGCAAAAAGGGTTGCCGGGTGCCCGCGCTCGTCGGCGCG
GACTGTCGGATGCGGCCCTGGGCACTCCGCGTCGGCACTTGTCCTACAAG
ACAGTCTGGTACGGGTCGGCGCTGGTGGTCGCCGACCGCTGGTTCCCGTC
GTCGAAAACCTGCCACGCCTGCCGGCATGTGCAAGACATCGGCTGGGACG
AACAATGGCAATGCGACCGATGCTCAGTGGTCCATCAGCGTGATGACTGC
GCTGCCATCAACCTCGCACGCTACGAGGAAACATCCAGCATCGTCGGCCC
AGTTGGGGCCGCCGTCAAGCGTGGAGCCGACCGTAAGACCGGGCCTCGCC
CGGCAGGTGGCTGTGAAGCGCGGAAGGGAAGCAGCCCCAAGGCTGCCGAA
CAACCCCGAGACGGGGTGCAAGTCGCGTGA
>scaffold1_orf00005 gene=F1M7K0_RAT5 CDS=21-110
GTGACCACTAAAGATCACTCACTTGCAACGGAGTCCCCGACGCTGCAGCA
GCTCGGCGAGTTCGCCGTGATCGACCGGCTGGTGCGGGGGCGCCGACAAC
CCGCCACGGTACTGCTCGGGCCCGGCGACGATGCCGCGCTGGTGTCTGCC
GGCGATGGTCGCACTGTGGTGTCGACGGACATGCTGGTGCAAGATAGTCA
CTTCCGGCTGGACTGGTCGACACCGCAGGACGTCGGCCGCAAGGCGATCG
CCCAGAATGCCGCCGACATCGAGGCGATGGGGGCGCGGGCCACCGCGTTC
GTGGTCGGCTTTGGAGCACCCGCTGAGACGCCGGCGGCGCAGGCGAGCGC
GTTGGTCGACGGAATGTGGGAGGAGGCGGGGCGCATTGGTGCCGGCATCG
TCGGCGGCGATCTGGTCAGCTGCCGGCAGTGGGTGGTGTCGGTCACCGCG
ATTGGTGACCTTGACGGTCGTGCCCCGGTGCTGCGCTCCGGGGCGAAGGC
CGGCTCGGTGCTGGCCGTCGTCGGTGAGCTGGGCCGCTCGGCTGCTGGCT
ATGCGCTGTGGTGCAACGGGATTGAAGACTTCGCCGAACTGCGCCGCCGC
CATTTGGTGCCGCAGCCGCCCTACGGCCACGGCGCGGCGGCCGCGGCTGT
CGGGGCTCAAGCGATGATCGATGTCTCCGACGGGCTGCTCGCCGATCTGC
GGCACATCGCCGAGGCATCCGGCGTGCGCATCGACCTGTCCGCCGCGGCG
TTGGCCGCTGACCGCGACGCTTTGACTGCGGCCGCAACCGCTCTGGGCAC
CGACCCCTGGCCGTGGGTGCTAAGCGGGGGTGAAGATCATGCCCTGGTCG
CCTGTTTCGTCGGTCCGGTGCCGGCCGGGTGGCGCACCATTGGCCGGGTT
CTCGACGGGCCGGCTAGGGTGCTGGTCGACGGCGAGGAGTGGACTGGATA
CGCGGGCTGGCAATCGTTTGGGGAGCCAGACAATCAAGGTTCGCTAGGGT
GA
#!/usr/bin/perl -w
open IN,"$ARGV[0]";
my %hash;
my $k;
my $n;
my @a;
my @b;
my @c;
my @key;
my $gene_id;
my $first_seq;
my $first_id;
my $rev_first_seq;
my $length;
my %hash2;
while (){
        chomp;
        if (/>/){
                @a=split /\s+/,$_;
                $first_id = $a[0] if ($.==1);#找出第一条序列的id并赋值;
                $first_id=~s/>//g;
                $gene_id = $a[0];
                $gene_id=~s/>//g;
                print "$a[2]\n";
                print "$gene_id\t$a[1]\t$1\t$2\n" if ($a[2]=~/([\d]+)-([\d]+)/);

        }else{
                $hash{$gene_id} .=$_;
        }
}

#计算每个序列长度,并且把id和长度存入一个哈希中
foreach $k (sort keys %hash){
        print "$k\t$hash{$k}\n";
        $length=length($hash{$k});
        $hash2{$k}=$length;


}


#找出最长序列的id和长度
@key =sort {$hash2{$b} <=> $hash2{$a}} keys %hash2;
foreach $n (@key){
        #print "$n\t$hash2{$n}\n";
        my $max_id_len = $n.":".$hash2{$n};
        #print $max_id_len;
        push(@c,$max_id_len);
}
print "$c[0]\n";

#第一条id序列的反向互补
print "--------------------------------\n";
print "fisrt_seq_id:$first_id\n";
close IN;
$first_seq = $hash{$first_id};
print "$first_seq\n";
$rev_first_seq = reverse($first_seq);
print "$rev_first_seq\n";
$rev_first_seq=~tr/ACGTacgt/TGCAtgca/;
print "第一条序列反向互补序列:$rev_first_seq\n";


#统计长度在200~500之间的序列,并按长度排序输出 ID 和长度
print "符合长度的序列\n";
foreach my $y (sort keys %hash2){
        print "$y\t$hash2{$y}\n" if ($hash2{$y}<600 and $hash2{$y}>500);#如果hash2,也就是存放长度的hash的值符合一个条件,则输出对于的基因id和长度
}

································································································
目的:打印文件的前面5行

#!/usr/bin/perl
open IN,"$ARGV[0]";
$i=0;
while (){
        chomp;
        #print "$_\n" if($.<=5);#这个是利用特殊变量,$.表示当前读取数据的行号。当读取到第5个就给个条件停止while循环
        $i++;
        print "$_\n" if($i<=5);#如果不知道特殊变量,那就自己造一个,每次读取一行就加1,这样就可以到第5行
}

··········································································

#!/usr/bin/perl -w
# 计算1 2 3 4 5的最大值,最小值和平均数。
my @array=qw(1 5 3 4 5);
my $num= @array;
my $sum;
#求平均值
foreach (@array){
        $sum += $_;
        #my $ave=$total/$num;
        #print "$total\t$ave\n";
}
my $ave=$sum/$num;
print "$sum\t$ave\n";

#求最大值
my $max=0;
foreach (@array){
        if($_>$max){
                $max=$_;
                #print "$max\n";
        }
        #print "$max\n";
}
print "$max\n";

将以下字母c a e w i m j q z s n 存入数组,排序后输出。

#!/usr/bin/perl -w
my @array = qw(c a e w i m j q z s n);
@array = sort {$a cmp $b} @array;#列表排序
print "@array,\n";
#!/usr/bin/perl -w
my %overtime_table=(
'David'=> 'Monday',
'Stephen'=> 'Wednesday',
'Kobe'=>'Friday',
'LeBron'=>'Monday',
);
print "please input worker name:\n";
my $name = chomp;
if (exists($overtime_table{$name})){
     print "$name\t$overtime_table{$name}\n";
}

把fasta格式序列以tab键分割形式,也就是一列为ID,一列为序列输出

#!/usr/bin/perl -w
open IN,"$ARGV[0]";
my %hash;
my $k;
my @a;
my $id;
while(){
        chomp;
        if(/>/){
                @a = split /\s+/,$_;
                $a[0]=~s/>//;
                $id = $a[0];
        }else{
                $hash{$id}.=$_;
        }
}

foreach $k (keys %hash){
        print "$k\t$hash{$k}\n";
}

你可能感兴趣的:(perl实战-合并两个列相同的文件)