4

私は次のことをしようとしています

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

しかし、入力 fasta ファイルが大きいと時間がかかります。

入力ファイルは次のようになります。

>seq1
ATCGGTTA
>seq2
ATGGGGGG

より速い代替手段はありますか?

4

4 に答える 4

4

手作りのステートマシン。行の先頭で「>」のみを受け入れたい場合は、もう1つの状態が必要になります。'\ 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;
}

実際の速度が必要な場合は、fgetc()とfputc()を同等のマクロgetc()とputc()に置き換えることができます。(しかし、このような些細なプログラムはとにかくI / Oバウンドになると思います)

于 2012-06-19T09:39:26.087 に答える
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を使用して検索します。

于 2012-06-19T09:12:17.723 に答える
3

大きなファイルの場合、可能な限り高速にGNU parallelgrepを使用して実現できます。とを使用した例は、ここにあります。parallelgrep

あなたの目的のために、あなたは試してみたいかもしれません:

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

上記は 4 つのコアを使用し、10 MB のブロックをgrep. ブロック サイズはオプションですが、私のシステムでは 10 MB のブロック サイズを使用するとかなり高速になることがわかりました。YRMV。

HTH

于 2012-06-19T23:31:47.220 に答える
2

Ack は、コード内の文字列/正規表現を検索するための grep の優れた代替手段です。

http://beyondgrep.com/

于 2014-09-18T14:52:46.697 に答える