2024年2月23日发(作者:)
《Perl语言入门实战习题》一、计算FASTA文件中每条序列的长度;输入文件,FASTA格式:注:如果输入文件在输出文件:windows下产生,在Linux系统下操作时,宜先用dos2unix处理:用法:dos2unix 输入文件Perl代码:#!/usr/bin/perl -w
use strict;
unless (@ARGV==2) {
}
my ($infile,$outfile) = @ARGV; # 把命令行参数赋值给输入文件和输出文件 # 打开输入文件句柄OUTINopen IN,$infile || die"error: can't open infile: $infile";open OUT,">$outfile" || die$!; # 打开输出文件句柄$/=">";
”>”,并去除第一个”>”while ( my $seq =
my $id = $1 if($seq =~ /^(S+)/); # 获取序列ID
chomp $seq; # 去掉末尾的”>”$seq =~ s/^.+?n//; # 删除第一行$seq =~ s/s//g; # 删除序列中的空白字符my $len = length($seq); # 计算序列长度print OUT "$idt$lenn"; # 输出结果到输出文件}
$/="n"; # 把输入记录分隔符改为默认值close IN; # 关闭输入文件句柄close OUT; # 关闭输出文件句柄二、计算FASTA文件中每条序列的输入文件同上,输出文件:GC含量;Perl代码:#!/usr/bin/perl -w
use strict;
unless (@ARGV==2) {# @ARGV
}
my ($infile,$outfile) = @ARGV;# 把命令行参数赋值给输入文件和输出文件# 打开输入文件句柄OUT$_,$_= 可以省略不写INopen IN,$infile || die"error: can't open infile: $infile";open OUT,">$outfile" || die$!;# 打开输出文件句柄$/=">";
chomp; # 去掉末尾的”>”s/^.+?n//;# 删除第一行s/s//g; # 删除序列中的空白字符my $GC = (tr/GC/GC/);#计算G或C碱基个数my $AT = (tr/AT/AT/);#计算A或T碱基个数my $len = $GC + $AT;# 计算序列非N长度my $gc_cont = $len ? $GC / $len : 0; #计算GC含量,如果长度为print OUT "$idt$gc_contn"; # 输出结果到输出文件}
$/="n";# 把输入记录分隔符改为默认值close IN; # 关闭输入文件句柄close OUT;# 关闭输出文件句柄0,GC含量算0
三、求反相互补序列;输入文件同上,输出文件也是Perl代码:#!/usr/bin/perl -w
use strict;
unless (@ARGV==2) {# @ARGV
}
my ($infile,$outfile) = @ARGV;# 把命令行参数赋值给输入文件和输出文件# 打开输入文件句柄OUT$_,$_= 可以省略不写INopen IN,$infile || die"error: can't open infile: $infile";open OUT,">$outfile" || die$!;# 打开输出文件句柄$/=">";
chomp; # 去掉末尾的”>”s/^.+?n//;# 删除第一行s/s//g; # 删除序列中的空白字符$_ = reverse $_; # 序列方向tr/ATCG/TAGC/; # 序列互补print OUT ">$idn",$_,"n";
}
$/="n";# 把输入记录分隔符改为默认值close IN; # 关闭输入文件句柄close OUT;# 关闭输出文件句柄四、列表信息整合;输入列表1:序列长度文件# 输出结果到输出文件输入文件2:序列测序覆盖深度文件输出文件:把上述两个列表的信息整合成一个列表,并且最后一行给出汇总结果:
Perl代码#!/usr/bin/perl -w
use strict;
(@ARGV==3) || die"Usage: perl $0
# 当命令行参数不是3的时候输出使用说明1、输入文件2和输出文件my ($infile1,$infile2,$outfile) = @ARGV;
# 把命令行参数赋值给输入文件my %id_len; # 定义一个哈希open IN1,$infile1 || die$!; # 打开第一个文件句柄while(
my ($id,$len) = split /s+/,$_; # split函数用空白符号切割每一行的内容$id_len{$id} = $len; # 哈希赋值:id => length}
close IN1; # 关闭第一个文件句柄open IN2,$infile2 || die$!; # 打开第2个文件句柄open OUT,">$outfile" || die$!; # 打开输出文件句柄my $tol_len = 0; # 定义总长度变量,并赋值为my $tol_depth = 0; # 定义总深度变量,并赋值为while (
my ($id,$depth) = split; # split函数用空白符号切割每一行的内容my $len = $id_len{$id}; # 序列长度print OUT join("t",$id,$len,$depth),"n";
$tol_len += $len; # 长度累加$tol_depth += $len * $depth; # 深度累加}
$tol_depth /= $tol_len; # 计算总体平均深度print OUT "Totalt$tol_lent$tol_depthn";close IN2; # 关闭第二个输入文件句柄close OUT; # 关闭输出文件句柄 # 输出汇总结果到输出文件# 输出整合信息到输出文件00五、串流程;Perl在工作中常用于串流程,现有同事写了成最终的:第1步:perl output1
第2步:perl output2
第3步:perl output1 output2
3个perl脚本分三步将输入文件,处理
为提高工作效率,现需要写一个脚本使用间产生的文件结果不保留。#!/usr/bin/perl -w
use strict;
unless (@ARGV==2) {# @ARGV
}
my ($infile,$outfile) = @ARGV; 作为输入文件,直接得到,中传给脚本的命令行参数列表# 当命令行参数不是2的时候输出使用说明die"Usage: perl $0
perl $infle $temp.2
perl $temp.1 $temp.2 $outfile
rm $temp.1 $temp.2”#使用system调用3个perl脚本进行处理
发布者:admin,转转请注明出处:http://www.yc00.com/web/1708637461a1578497.html
评论列表(0条)