我正在尝试执行以下操作
$ grep ">" file.fasta > output.txt
但是当输入的fasta文件很大时,它需要很长时间。
输入文件如下所示:
>seq1
ATCGGTTA
>seq2
ATGGGGGG
有更快的替代方案吗?
答案 0 :(得分:4)
将time命令与所有这些
一起使用$> time grep ">" file.fasta > output.txt
$> time egrep ">" file.fasta > output.txt
$> time awk '/^>/{print $0}' file.fasta > output.txt -- If ">' is first letter
如果你看到输出......他们几乎是一样的。
在我看来,如果数据采用柱状格式,请使用 awk 进行搜索。
答案 1 :(得分:3)
手工制作状态机。如果你只想要'>'要在行首开始接受,你还需要一个州。如果您还需要识别'\ r',则需要更多状态。
#include <stdio.h>
int main(void)
{
int state,ch;
for(state=0; (ch=getc(stdin)) != EOF; ) {
switch(state) {
case 0: /* start */
if (ch == '>') state = 1;
else break;
case 1: /* echo */
fputc(ch,stdout);
if (ch == '\n') state = 0;
break;
}
}
if (state==1) fputc('\n',stdout);
return 0;
}
如果你想要真正的速度,你可以用它们的宏等效物getc()和putc()替换fgetc()和fputc()。 (但我认为像这样的琐碎程序无论如何都会受到I / O限制)
答案 2 :(得分:2)
对于大文件,可以使用GNU parallel完成最快的grep
。使用parallel
和grep
的示例可以找到here。
出于您的目的,您可以尝试:
cat file.fasta | parallel -j 4 --pipe --block 10M grep "^\>" > output.txt
以上将使用四个核心,并将10 MB块解析为grep
。块大小是可选的,但我发现在我的系统上使用10 MB的块大小要快得多。 YRMV。
HTH
答案 3 :(得分:2)
Ack是grep的一个很好的替代品,可以在代码中找到字符串/正则表达式: