nameFile
seq_1014
seq_1039
seq_2848
seq_3213
seq_6847
seq_6980
seq_6997
seq_9319
seq_9561
seq_9850
# outputFile
>seq_1014
>seq_1039
>seq_2848
>seq_3213
>seq_6847
>seq_6980
>seq_6997
>seq_9319
>seq_9561
>seq_9850
>seq_10140
>seq_10141
>seq_10142
>seq_10143
>seq_10144
>seq_10145
>seq_10146
###Scriptuse
#!/usr/bin/env perl
my $list_file = $ARGV[0];
my $fasta_in = $ARGV[1];
my $fasta_out = $ARGV[2];
open(LIST_FILE, "<", $list_file) or die "could not open '$list_file' : $! \n";
open(FASTA_IN, "<", $fasta_in) or die "could not open '$fasta_in' : $! \n";
open(FASTA_OUT, ">", $fasta_out) or die "could not open $fasta_out : $! \n";
my @headers = ();
while(<LIST_FILE>) {
chomp;
next if ( /^\s*$/ );
push(@headers, $_);
}
my $pat = join '|', map quotemeta, @headers;
$/ = ">";
while(<FASTA_IN>) {
chomp;
if ( /$pat/ ) { print FASTA_OUT ">$_"; }
}
close(LIST_FILE);
close(FASTA_IN);
close(FASTA_OUT);
問題は不要な出力です。
>seq_10140
>seq_10141
>seq_10142
>seq_10143
>seq_10144
>seq_10145
>seq_10146
正確な名前が一致し、シーケンスに対してfastaをgrepしたいのですが、このスクリプトはseq_1014が望むように混乱し、また次のものを提供します。
>seq_10140
>seq_10141
>seq_10142
>seq_10143
>seq_10144
>seq_10145
>seq_10146
目的の出力を取得するためにこのスクリプトを変更する方法
答え1
2つの質問があります。
- 不要な一致:これはパターンの各句を終了しないために発生します。$最後にマッチさせたいという意味を示します。ABCD続いて何もない。 seq_10140 するマッチseq_1014なぜならseq_1014 はいそこ(どこか)。最後に他のキャラクターが失敗するとは言わなかった。seq_1014$。
- 一致する必要があるときに失敗する:この部分は、コードと入力ファイルをコピーするときに私のシステムで機能します。 1039など。するマッチ。私が考えるのはあなただけです。$patスキーマファイルに問題があり、1つの節だけが残りました。そのファイルを切り取り、このフォーラムに貼り付けるか貼り付ける方法で編集中です。通常、これは2つのことがあることを意味します。行末DOSと同様に、最初の読み込み時にファイル全体を読み込みます。しかし、他の問題もたくさんあるかもしれません。デバッグまたは印刷ステートメントを追加して内容を確認してください。@タイトルそして$pat。 「C」プログラムまたは「hexl-mode」のEmacsを介してファイルのバイト単位の出力を取得し、読み取りに混乱を与える内容があることを確認してください。