私は次のことをしようとしています
$ grep ">" file.fasta > output.txt
しかし、入力 fasta ファイルが大きいと時間がかかります。
入力ファイルは次のようになります。
>seq1
ATCGGTTA
>seq2
ATGGGGGG
より速い代替手段はありますか?
手作りのステートマシン。行の先頭で「>」のみを受け入れたい場合は、もう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バウンドになると思います)
これらすべてで 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を使用して検索します。
大きなファイルの場合、可能な限り高速にGNU parallelgrep
を使用して実現できます。とを使用した例は、ここにあります。parallel
grep
あなたの目的のために、あなたは試してみたいかもしれません:
cat file.fasta | parallel -j 4 --pipe --block 10M grep "^\>" > output.txt
上記は 4 つのコアを使用し、10 MB のブロックをgrep
. ブロック サイズはオプションですが、私のシステムでは 10 MB のブロック サイズを使用するとかなり高速になることがわかりました。YRMV。
HTH
Ack は、コード内の文字列/正規表現を検索するための grep の優れた代替手段です。