如何使用序列 ID 提取 FASTA 序列(shell 脚本)
How to extract FASTA sequence using sequence ID (shell script)
我有以下序列,它们是带有序列头及其核苷酸的 fasta 格式。
如何比较两个文件(Kcompare.pep 和 clade1i.txt)并提取具有相同序列头的序列?
谁能帮帮我?
Kcompare.pep
>ztr:MYCGRDRAFT_45998
MAAPLHAEGPIRTPYTGVELLNTPYLNKGTAFPADERRVLGLTALLPTSVHTLDQQLQRA
WHQYQSRDNDLARNTFLTSLKEQNEVLYYRLVLDHLSEVFSIIYTPTEGEAIQRYSSLFR
>kal:KALB_5042
MTAEVAVVSDGSAIPGASPPATLPLLQDYAELVREHAGLSAVPLAVDSARLAAELCALPK
RFRAVFLTHTDPERAFQVQRAVAKAGGPLVITDQDTTAISLTASTLTTLARRGRSPSDSR
clade1i.txt
cpo:COPRO5265_0583
ble:BleG1_3845
kal:KALB_5042
预期输出
>kal:KALB_5042
MTAEVAVVSDGSAIPGASPPATLPLLQDYAELVREHAGLSAVPLAVDSARLAAELCALPK
RFRAVFLTHTDPERAFQVQRAVAKAGGPLVITDQDTTAISLTASTLTTLARRGRSPSDSR
我尝试 运行 这样做,但没有出现错误或结果。
for i in K*
do
echo $i
awk -F ' ' '{print }' $i/$i.pep > Kcompare.pep
mv Kcompare.pep $i
awk -F '_' '{print ":""_"}' $i/firstClade.txt > $i/clade1i.txt
awk 'NR==1{printf [=14=]"\t";next}{printf /^>/ ? "\n"[=14=]"\t" : [=14=]}' $i/Kcompare.pep | awk -F"\t" 'BEGIN{while((getline k <"$i/clade1i.txt")>0)i[k]=1}{gsub("^>","",[=14=]);if(i[]){print ">""\n"}}' > $i/firsti.pep
done
使用这个:
while read l; do
sed -n '/^>'"$l"'/,/^>|$/p' Kcompare.pep
done <clade1i.txt
while
循环逐行遍历 clade1i.txt
文件。
sed -n
禁止自动打印。
/regex/,/regex/
匹配从第一个正则表达式到第二个正则表达式的所有内容。
p
打印匹配的行。
使用 awk:
awk 'NR==FNR{a[">"[=10=]];next}/^>/{f=0;}([=10=] in a)||f{print;f=1}' clade1i.txt Kcompare.pep
读取 clade1i.txt 文件并作为键存储在数组中。
阅读Kcompare.pep。对于以'>'开头的每一行,设置一个标志,并继续打印这些行,直到遇到下一个以'>'开头的行。
我有以下序列,它们是带有序列头及其核苷酸的 fasta 格式。 如何比较两个文件(Kcompare.pep 和 clade1i.txt)并提取具有相同序列头的序列? 谁能帮帮我?
Kcompare.pep
>ztr:MYCGRDRAFT_45998
MAAPLHAEGPIRTPYTGVELLNTPYLNKGTAFPADERRVLGLTALLPTSVHTLDQQLQRA
WHQYQSRDNDLARNTFLTSLKEQNEVLYYRLVLDHLSEVFSIIYTPTEGEAIQRYSSLFR
>kal:KALB_5042
MTAEVAVVSDGSAIPGASPPATLPLLQDYAELVREHAGLSAVPLAVDSARLAAELCALPK
RFRAVFLTHTDPERAFQVQRAVAKAGGPLVITDQDTTAISLTASTLTTLARRGRSPSDSR
clade1i.txt
cpo:COPRO5265_0583
ble:BleG1_3845
kal:KALB_5042
预期输出
>kal:KALB_5042
MTAEVAVVSDGSAIPGASPPATLPLLQDYAELVREHAGLSAVPLAVDSARLAAELCALPK
RFRAVFLTHTDPERAFQVQRAVAKAGGPLVITDQDTTAISLTASTLTTLARRGRSPSDSR
我尝试 运行 这样做,但没有出现错误或结果。
for i in K*
do
echo $i
awk -F ' ' '{print }' $i/$i.pep > Kcompare.pep
mv Kcompare.pep $i
awk -F '_' '{print ":""_"}' $i/firstClade.txt > $i/clade1i.txt
awk 'NR==1{printf [=14=]"\t";next}{printf /^>/ ? "\n"[=14=]"\t" : [=14=]}' $i/Kcompare.pep | awk -F"\t" 'BEGIN{while((getline k <"$i/clade1i.txt")>0)i[k]=1}{gsub("^>","",[=14=]);if(i[]){print ">""\n"}}' > $i/firsti.pep
done
使用这个:
while read l; do
sed -n '/^>'"$l"'/,/^>|$/p' Kcompare.pep
done <clade1i.txt
while
循环逐行遍历clade1i.txt
文件。sed -n
禁止自动打印。/regex/,/regex/
匹配从第一个正则表达式到第二个正则表达式的所有内容。p
打印匹配的行。
使用 awk:
awk 'NR==FNR{a[">"[=10=]];next}/^>/{f=0;}([=10=] in a)||f{print;f=1}' clade1i.txt Kcompare.pep
读取 clade1i.txt 文件并作为键存储在数组中。 阅读Kcompare.pep。对于以'>'开头的每一行,设置一个标志,并继续打印这些行,直到遇到下一个以'>'开头的行。