通过与 bash 中的 id 行的部分匹配来过滤 multi-entry .fasta 文件
Filter multi-entry .fasta file by partial match to id line in bash
我有一个.fasta文件,例如:
>LTR22_Mio ERV2 Microtus ochrogaster
tgtcacgccacctcctgcggagtctgcgtgatctctcacgtaggctgtggcacaagcttcaaggaagagt
gcccgcagagaaggtgtgtgtgctgtgcttcctgcatcggagcccttgcacttttggcattacctgctta
tgttctaaggaatacagtctggtttcttctggaagggaagatagtatgtttaagtttccagagtctactg
>LTR23 ERV2 Mus Musculus
tgtcacgccacctcctgcggagtctgcgtgatctctcacgtaggctgtggcaca
>LTR_IAP ERV2 Mus Musculus
tgtcacgccacctcctgcggagtctgcgtgatctctcacgtaggctgtggcacaagcttcaaggaagagt
gcccgcagagaaggtgtgtgtgctgtgcttcctgcatcggagcccttgcacttttggcattacctgctta
tgttctaaggaatacagtctggtttcttctggaagggaagatagtatgtttaagtttccagagtctactg
atgagacattgccatatacaggagtatatgatgctaatggaggaagatgggttaacattcaaggcaaaaa
我正在尝试提取所有 headers(以 >...
开头的行)和以下文本块,直到下一个 >
与特定模式部分匹配,在我的示例中:"Mus musculus"
。理想的结果是:
>LTR23 ERV2 Mus Musculus
tgtcacgccacctcctgcggagtctgcgtgatctctcacgtaggctgtggcaca
>LTR_IAP ERV2 Mus Musculus
tgtcacgccacctcctgcggagtctgcgtgatctctcacgtaggctgtggcacaagcttcaaggaagagt
gcccgcagagaaggtgtgtgtgctgtgcttcctgcatcggagcccttgcacttttggcattacctgctta
tgttctaaggaatacagtctggtttcttctggaagggaagatagtatgtttaagtttccagagtctactg
atgagacattgccatatacaggagtatatgatgctaatggaggaagatgggttaacattcaaggcaaaaa
我尝试 google 解决这个相对常见的问题,但只找到了 third-party 个包,但希望有一个基于 bash
的本地解决方案。
我找到了 grep
one-liner,但它输出的不是 "header" 行之后的完整文本块(来源:https://www.biostars.org/p/319099/):
grep -w -A 2 -f pattern.txt myfile.fasta --no-group-separator
pattern.txt:
Mus Musculus
非常感谢您的支持!
如果 awk
是您的选择,请您尝试以下操作:
awk 'BEGIN {RS = "(^|\n)>"}
/Mus Musculus/ {
sub(/\n$/, "");
print ">" [=10=]
}
' file.fasta
输出:
>LTR23 ERV2 Mus Musculus
tgtcacgccacctcctgcggagtctgcgtgatctctcacgtaggctgtggcaca
>LTR_IAP ERV2 Mus Musculus
tgtcacgccacctcctgcggagtctgcgtgatctctcacgtaggctgtggcacaagcttcaaggaagagt
gcccgcagagaaggtgtgtgtgctgtgcttcctgcatcggagcccttgcacttttggcattacctgctta
tgttctaaggaatacagtctggtttcttctggaagggaagatagtatgtttaagtttccagagtctactg
atgagacattgccatatacaggagtatatgatgctaatggaggaagatgggttaacattcaaggcaaaaa
- 语句
BEGIN {RS = "(^|\n)>"}
分配记录分隔符RS
正则表达式表示“文件开头的字符 >
或在换行符之后”将文件拆分为由以下内容组成的记录
一对 header 线和基线。
- 模式
/Mus Musculus/
指定打印记录的条件。
- 语句
sub(/\n$/, "")
去掉了结尾多余的换行符
文件。
- 语句
print ">" [=18=]
输出字符前的记录
>
作为记录分隔符丢失。
我有一个.fasta文件,例如:
>LTR22_Mio ERV2 Microtus ochrogaster
tgtcacgccacctcctgcggagtctgcgtgatctctcacgtaggctgtggcacaagcttcaaggaagagt
gcccgcagagaaggtgtgtgtgctgtgcttcctgcatcggagcccttgcacttttggcattacctgctta
tgttctaaggaatacagtctggtttcttctggaagggaagatagtatgtttaagtttccagagtctactg
>LTR23 ERV2 Mus Musculus
tgtcacgccacctcctgcggagtctgcgtgatctctcacgtaggctgtggcaca
>LTR_IAP ERV2 Mus Musculus
tgtcacgccacctcctgcggagtctgcgtgatctctcacgtaggctgtggcacaagcttcaaggaagagt
gcccgcagagaaggtgtgtgtgctgtgcttcctgcatcggagcccttgcacttttggcattacctgctta
tgttctaaggaatacagtctggtttcttctggaagggaagatagtatgtttaagtttccagagtctactg
atgagacattgccatatacaggagtatatgatgctaatggaggaagatgggttaacattcaaggcaaaaa
我正在尝试提取所有 headers(以 >...
开头的行)和以下文本块,直到下一个 >
与特定模式部分匹配,在我的示例中:"Mus musculus"
。理想的结果是:
>LTR23 ERV2 Mus Musculus
tgtcacgccacctcctgcggagtctgcgtgatctctcacgtaggctgtggcaca
>LTR_IAP ERV2 Mus Musculus
tgtcacgccacctcctgcggagtctgcgtgatctctcacgtaggctgtggcacaagcttcaaggaagagt
gcccgcagagaaggtgtgtgtgctgtgcttcctgcatcggagcccttgcacttttggcattacctgctta
tgttctaaggaatacagtctggtttcttctggaagggaagatagtatgtttaagtttccagagtctactg
atgagacattgccatatacaggagtatatgatgctaatggaggaagatgggttaacattcaaggcaaaaa
我尝试 google 解决这个相对常见的问题,但只找到了 third-party 个包,但希望有一个基于 bash
的本地解决方案。
我找到了 grep
one-liner,但它输出的不是 "header" 行之后的完整文本块(来源:https://www.biostars.org/p/319099/):
grep -w -A 2 -f pattern.txt myfile.fasta --no-group-separator
pattern.txt:
Mus Musculus
非常感谢您的支持!
如果 awk
是您的选择,请您尝试以下操作:
awk 'BEGIN {RS = "(^|\n)>"}
/Mus Musculus/ {
sub(/\n$/, "");
print ">" [=10=]
}
' file.fasta
输出:
>LTR23 ERV2 Mus Musculus
tgtcacgccacctcctgcggagtctgcgtgatctctcacgtaggctgtggcaca
>LTR_IAP ERV2 Mus Musculus
tgtcacgccacctcctgcggagtctgcgtgatctctcacgtaggctgtggcacaagcttcaaggaagagt
gcccgcagagaaggtgtgtgtgctgtgcttcctgcatcggagcccttgcacttttggcattacctgctta
tgttctaaggaatacagtctggtttcttctggaagggaagatagtatgtttaagtttccagagtctactg
atgagacattgccatatacaggagtatatgatgctaatggaggaagatgggttaacattcaaggcaaaaa
- 语句
BEGIN {RS = "(^|\n)>"}
分配记录分隔符RS
正则表达式表示“文件开头的字符>
或在换行符之后”将文件拆分为由以下内容组成的记录 一对 header 线和基线。 - 模式
/Mus Musculus/
指定打印记录的条件。 - 语句
sub(/\n$/, "")
去掉了结尾多余的换行符 文件。 - 语句
print ">" [=18=]
输出字符前的记录>
作为记录分隔符丢失。