有以下形式的文本:
>xxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxx
>xxxxxxxxxxxxxx
xxxxxxxxx
>
如果中间符号>xxx...
的数量少于 100 个,我需要正则表达式匹配所有符号。我该怎么做?x
>
实际问题是:当尝试使用多个病毒的参考序列对 fasta 文件进行索引时,出现“smalt.c:334 错误:序列太短,无法进行哈希处理”。以前,当文件中只有较长的序列时,它可以正常工作。
我还没有找到解决 smalt 错误的办法(即使找到了,我也希望先使用默认设置运行它),所以
我需要从参考文件中删除所有较短的参考序列。
答案1
您可以使用grep
它来仅提供文件中相隔超过 100 个字符的部分>
,然后将结果写入新文件(然后应该与 fasta 一起使用):
grep -Pzo '>[^>]{100,}' fasta.txt > fasta_wo_short_genes.txt
解释:
-P
告诉 grep 接受珍珠正则表达式(由于某种原因,我无法让它与普通的 grep 正则表达式一起工作)z
告诉 grep 将整个文件视为一行o
告诉 grep 仅输出匹配的部分(否则,由于该z
标志,如果找到任何匹配项,它将始终输出整个文件)
正则表达式:
>
病毒基因序列之间的字符[^>]
匹配除以下字符之外的任何字符>
{100,}
匹配前一个表达式的 100 次或更多次重复(在本例中[^>]
)