需求:
PS:绿色部分为蛋白的名称等信息,后面的黑色部分为对应序列
我想把其中的某个蛋白信息连同它的序列提取出来,变成这样:
这里介绍两种方法:
第一个方法是不全面的,有不足之处:
一、
1.1 将原始参考库文件中的换行符替换成文本中确定没有的序列xxx,变成一行:
#! C:\other_disk\D_disk_software\perl64 -w
use utf8;
binmode(STDOUT,":utf8");
open(FH, "<GCF_016772045.1_ARS-UI_Ramb_v2.0_protein1.faa") or die "file cannot open, $!";
$_=<FH>;
#匹配的核心部分为.*?这里指匹配>NP_001009191.1和>中间的任意且最小匹配次数的字符串;非贪婪量词
$_=~/>NP_001009191\.1.*?>/;
#$&指默认变量:指匹配到的内容,还有$`和$'分别指匹配内容之前和之后的部分
print $&;
close FH;
接着我们命令行运行:
#sift1.pl指写着这个perl程序,2.txt指将输出的内容写到2.txt这个文件;
perl sift1.pl > 2.txt
1.2 我们得到一个满足我们一定需求的文件:
1.3 再将xxx替换成\n换行符,将>替换成空白即可:
二、
1.1只需要一个函数:
#! C:\other_disk\D_disk_software\perl64 -w
use utf8;
binmode(STDOUT,":utf8");
open(FH, "<GCF_016772045.1_ARS-UI_Ramb_v2.0_protein.faa") or die "file cannot open, $!";
#将<FH>的每一行粘合在一起
$_ = join("",<FH>);
if($_ =~ />NP_001009191\.1.[\d\D]*?>/){
print $&;
}
close FH;
接着我们命令行运行:
#sift1.pl指写着这个perl程序,2.txt指将输出的内容写到2.txt这个文件;
perl sift1.pl > 2.txt
直接得到结果:
写到最后:
这实际上谈不上是两种方法,只不过是根据需求和掌握perl的程度,提升思维和改变代码的过程。