需求:

GCF_016772045.1_ARS-UI_Ramb_v2.0_protein.faa(這是sheep的參考蛋白序列庫(kù))
PS:綠色部分為蛋白的名稱等信息,后面的黑色部分為對(duì)應(yīng)序列
我想把其中的某個(gè)蛋白信息連同它的序列提取出來(lái),變成這樣:
我想要的蛋白序列

我想要的蛋白序列
這里介紹兩種方法:
第一個(gè)方法是不全面的,有不足之處:
一、
1.1 將原始參考庫(kù)文件中的換行符替換成文本中確定沒(méi)有的序列xxx,變成一行:

GCF_016772045.1_ARS-UI_Ramb_v2.0_protein1.faa
#! 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和>中間的任意且最小匹配次數(shù)的字符串;非貪婪量詞
$_=~/>NP_001009191\.1.*?>/;
#$&指默認(rèn)變量:指匹配到的內(nèi)容,還有$`和$'分別指匹配內(nèi)容之前和之后的部分
print $&;
close FH;
接著我們命令行運(yùn)行:
#sift1.pl指寫(xiě)著這個(gè)perl程序,2.txt指將輸出的內(nèi)容寫(xiě)到2.txt這個(gè)文件;
perl sift1.pl > 2.txt
1.2 我們得到一個(gè)滿足我們一定需求的文件:

2.txt (所有的東西都擠到了一行)
1.3 再將xxx替換成\n換行符,將>替換成空白即可:

1

2
二、
1.1只需要一個(gè)函數(shù):
#! 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;
接著我們命令行運(yùn)行:
#sift1.pl指寫(xiě)著這個(gè)perl程序,2.txt指將輸出的內(nèi)容寫(xiě)到2.txt這個(gè)文件;
perl sift1.pl > 2.txt
直接得到結(jié)果:

2.txt
寫(xiě)到最后:
這實(shí)際上談不上是兩種方法,只不過(guò)是根據(jù)需求和掌握perl的程度,提升思維和改變代碼的過(guò)程。