使用awk通过文件中的ID从multifasta文件中提取序列

Dal*_*lík 7 search awk bioinformatics multiline fasta

我想从multifasta文件中提取与单独的ID列表给出的ID匹配的序列.

FASTA文件seq.fasta:

>7P58X:01332:11636
TTCAGCAAGCCGAGTCCTGCGTCGTTACTTCGCTT
CAAGTCCCTGTTCGGGCGCC
>7P58X:01334:11605
TTCAGCAAGCCGAGTCCTGCGTCGAGAGTTCAAGTC
CCTGTTCGGGCGCCACTGCTAG
>7P58X:01334:11613
ACGAGTGCGTCAGACCCTTTTAGTCAGTGTGGAAAC
>7P58X:01334:11635
TTCAGCAAGCCGAGTCCTGCGTCGAGAGATCGCTTT
CAAGTCCCTGTTCGGGCGCCACTGCGGGTCTGTGTC
GAGCG
>7P58X:01336:11621
ACGCTCGACACAGACCTTTAGTCAGTGTGGAAATCT
CTAGCAGTAGAGGAGATCTCCTCGACGCAGGACT
Run Code Online (Sandbox Code Playgroud)

ID文件id.txt:

7P58X:01332:11636
7P58X:01334:11613
Run Code Online (Sandbox Code Playgroud)

我想获取fasta文件,只包含与id.txt文件中的ID匹配的序列:

>7P58X:01332:11636
TTCAGCAAGCCGAGTCCTGCGTCGTTACTTCGCTTT
CAAGTCCCTGTTCGGGCGCC
>7P58X:01334:11613
ACGAGTGCGTCAGACCCTTTTAGTCAGTGTGGAAAC
Run Code Online (Sandbox Code Playgroud)

我真的很喜欢我在这里这里的答案中找到的awk方法,但是那里给出的代码仍然不能完美地用于我给出的例子.原因如下:

(1)

awk -v seq="7P58X:01332:11636" -v RS='>' '$1 == seq {print RS $0}' seq.fasta
Run Code Online (Sandbox Code Playgroud)

此代码适用于多行序列,但ID必须单独插入代码.

(2)

awk 'NR==FNR{n[">"$0];next} f{print f ORS $0;f=""} $0 in n{f=$0}' id.txt seq.fasta
Run Code Online (Sandbox Code Playgroud)

此代码可以从id.txt文件中获取ID,但只返回多行序列的第一行.

我想好的方法是修改代码中的RS变量(2),但到目前为止我的所有尝试都失败了.请问,有人帮我吗?

Ed *_*ton 7

$ awk -F'>' 'NR==FNR{ids[$0]; next} NF>1{f=($2 in ids)} f' id.txt seq.fasta
>7P58X:01332:11636
TTCAGCAAGCCGAGTCCTGCGTCGTTACTTCGCTT
CAAGTCCCTGTTCGGGCGCC
>7P58X:01334:11613
ACGAGTGCGTCAGACCCTTTTAGTCAGTGTGGAAAC
Run Code Online (Sandbox Code Playgroud)

  • `无论如何| awk '...' id.txt -` (3认同)