проблема Perl для получения желаемого результата

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

Я просто хочу, чтобы совпадали точные имена и последовательности grep fasta, но этот сценарий беспорядок, как будто я просто хочу seq_1014, и он также дает

>seq_10140
>seq_10141
>seq_10142
>seq_10143
>seq_10144
>seq_10145
>seq_10146

Как я могу исправить этот сценарий, чтобы получить желаемый результат

0
04.05.2017, 09:40
1 ответ

Итак, две проблемы:

  1. Нежелательные совпадения :Это связано с тем, что вы не заканчивали каждое предложение шаблона $ в конце, чтобы указать, что вы хотите сопоставить abced , за которым следует ничего .seq _10140соответствует ли seq _1014 , потому что seq _1014есть там (где-то ). Вы не сказали, что еще один символ в конце вызовет ошибку, сказав seq _1014$ .
  2. Несоответствие, когда должно быть. :Эта часть работает в моей системе, когда я копирую ваш код и ваши входные файлы. 1039 и так далее соответствуют . Все, о чем я могу думать, это то, что ваш $pat состоит всего из одного предложения из-за какой-то проблемы с вашим файлом шаблона, который был исправлен путем вырезания -и -вставки его в этот форум и из него. Обычно это означает, что в конце каждой строки в стиле DOS есть два символа End Of Line , и при первом чтении считывается весь файл. Однако есть множество других вещей, которые могут быть с ними неправильными. Возьмите его в отладку или просто добавьте операторы печати, чтобы увидеть, что находится в @headers и $pat . Получите байт -на -байт вывода файла с помощью программы «C» или Emacs в «режиме hexl -», чтобы увидеть, не сбивает ли что-то там ваши чтения.
0
28.01.2020, 04:46

Теги

Похожие вопросы