正则表达式匹配“长度小于 X 的字符串位于两个“>”符号之间”

正则表达式匹配“长度小于 X 的字符串位于两个“>”符号之间”

有以下形式的文本:

>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 次或更多次重复(在本例中[^>]

相关内容