使用 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.txt
从 name.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
我有 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.txt
从name.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