使用 AWK 搜索 fasta 文件,给出包含序列名称的第二个文件

Use AWK to search through fasta file, given a second file containing sequence names

我有 2 个文件。一个是包含多个fasta序列的fasta文件,而另一个文件包含我要搜索的候选序列的名称(下面的文件示例)。

seq.fasta

>Clone_18
GTTACGGGGGACACATTTTCCCTTCCAATGCTGCTTTCAGTGATAAATTGAGCATGATGGATGCTGATAATATCATTCCCGTGT
>Clone_23
GTTACGGGGGGCCGAAAAACACCCAATCTCTCTCTCGCTGAAACCCTACCTGTAATTTGCCTCCGATAGCCTTCCCCGGTGA
>Clone_27-1
GTTACGGGGACCACACCCTCACACATACAAACACAAACACTTCAAGTGACTTAGTGTGTTTCAGCAAAACATGGCTTC
>Clone_27-2
GTTACGGGGACCACACCCTCACACATACAAACACAAACACTTCAAGTGACTTAGTGTGTTTCAGCAAAACATGGCTTCGTTTTGTTCTAGATTAACTATCAGTTTGGTTCTGTTTGTCCTCGTACTGGGTTGTGTCAATGCACAACTT
>Clone_34-1
GTTACGGGGGAATAACAAAACTCACCAACTAACAACTAACTACTACTTCACTTTTCAACTACTTTACTACAATACTAAGAATGAAAACCATTCTCCTCATTATCTTTGCTCTCGCTCTTTTCACAAGAGCTCAAGTCCCTGGCTACCAAGCCATCG
>Clone_34-3
GTTACGGGGGAATAACAAAACTCACCAACTAACAACTAACTACTACTTCACTTTTCAACTACTTTACTACAATACTAAGAATGAAAACCATTCTCCTCATTATCTTTGCTCTCGCTCTTTTCACAAGAGCTCAAGTCCCTGGCTACCAAGCCATCGATATCGCTGAAGCCCAATC
>Clone_44-1
GTTACGGGGGAATCCGAATTCACAGATTCAATTACACCCTAAAATCTATCTTCTCTACTTTCCCTCTCTCCATTCTCTCTCACACACTGTCACACACATCC
>Clone_44-3
GTTACGGGGGAATCCGAATTCACAGATTCAATTACACCCTAAAATCTATCTTCTCTACTTTCCCTCTCTCCATTCTCTCTCACACACTGTCACACACATCCCGGCAGCGCAGCCGTCGTCTCTACCCTTCACCAGGAATAAGTTTATTTTTCTACTTAC

name.txt

Clone_23
Clone_27-1

我想使用 AWK 搜索 fasta 文件,并获取名称保存在另一个文件中的给定候选人的所有 fasta 序列。

awk 'NR==FNR{a[]=} BEGIN{RS="\n>"; FS="\n"} NR>FNR {if (match(,">")) {sub(">","",)} for (p in a) {if (==p) print ">"[=12=]}}' name.txt seq.fasta

问题是我只能提取name.txt中第一个候选的序列,像这样

>Clone_23
GTTACGGGGGGCCGAAAAACACCCAATCTCTCTCTCGCTGAAACCCTACCTGTAATTTGCCTCCGATAGCCTTCCCCGGTGA

任何人都可以帮助修复上面的一行 awk 命令吗?

如果可以甚至还想打印名称,您可以简单地使用 grep:

grep -Ff name.txt -A1 a.fasta
  • -f name.txtname.txt
  • 中选取模式
  • -F 将它们视为文字字符串而不是正则表达式
  • A1 打印匹配行加上后续行

如果输出中不需要这些名称,我会简单地通过管道传输到另一个 grep:

above_command | grep -v '>'

awk 解决方案可能如下所示:

awk 'NR==FNR{n[[=12=]];next} substr([=12=],2) in n && getline' name.txt a.fasta

在多行版本中有更好的解释:

# True as long as we are reading the first file, name.txt
NR==FNR {
    # Store the names in the array 'n'
    n[[=13=]]
    next
}

# I use substr() to remove the leading `>` and check if the remaining
# string which is the name is a key of `n`. getline retrieves the next line
# If it succeeds the condition becomes true and awk will print that line
substr([=13=],2) in n && getline
$ awk 'NR==FNR{n[">"[=10=]];next} f{print f ORS [=10=];f=""} [=10=] in n{f=[=10=]}' name.txt seq.fasta
>Clone_23
GTTACGGGGGGCCGAAAAACACCCAATCTCTCTCTCGCTGAAACCCTACCTGTAATTTGCCTCCGATAGCCTTCCCCGGTGA
>Clone_27-1
GTTACGGGGACCACACCCTCACACATACAAACACAAACACTTCAAGTGACTTAGTGTGTTTCAGCAAAACATGGCTTC