Unix Grep的更快替代品

时间:2012-06-19 05:55:00

标签: unix grep

我正在尝试执行以下操作

$ grep ">" file.fasta > output.txt

但是当输入的fasta文件很大时,它需要很长时间。

输入文件如下所示:

>seq1
ATCGGTTA
>seq2
ATGGGGGG

有更快的替代方案吗?

4 个答案:

答案 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。使用parallelgrep的示例可以找到here

出于您的目的,您可以尝试:

cat file.fasta | parallel -j 4 --pipe --block 10M grep "^\>" > output.txt

以上将使用四个核心,并将10 MB块解析为grep。块大小是可选的,但我发现在我的系统上使用10 MB的块大小要快得多。 YRMV。

HTH

答案 3 :(得分:2)

Ack是grep的一个很好的替代品,可以在代码中找到字符串/正则表达式:

http://beyondgrep.com/