원하는 출력을 얻기 위한 Perl 문제

원하는 출력을 얻기 위한 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

정확한 이름이 일치하고 시퀀스에 대해 fasta를 grep하고 싶지만 이 스크립트는 seq_1014를 원하는 것처럼 혼란스럽고 또한 다음을 제공합니다.

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

원하는 출력을 얻기 위해 이 스크립트를 수정하는 방법

답변1

두 가지 질문이 있습니다.

  1. 원하지 않는 일치: 이는 패턴의 각 절을 종료하지 않아서 발생합니다.$마지막으로 일치시키고 싶다는 뜻을 나타냅니다.ABCD이어서아무것도 없다. seq_10140 하다성냥seq_1014왜냐하면seq_1014 거기 (어딘가). 마지막에 다른 캐릭터가 실패할 거라고는 말 안하셨는데seq_1014$.
  2. 일치해야 할 때 실패함: 이 부분은 코드와 입력 파일을 복사할 때 내 시스템에서 작동합니다. 1039등.하다성냥. 내가 생각하는 건 너뿐이야$pat스키마 파일에 문제가 있어 단 한 절만 남았습니다. 해당 파일을 잘라내어 이 포럼에 붙여넣거나 붙여넣는 방식으로 수정 중입니다. 일반적으로 이는 두 가지가 있음을 의미합니다.줄 끝DOS와 마찬가지로 처음 읽을 때 전체 파일을 읽습니다. 그러나 다른 문제도 많이 있을 수 있습니다. 디버깅하거나 인쇄 문을 추가하여 내용을 확인하세요.@제목그리고$pat. "C" 프로그램이나 "hexl-mode"의 Emacs를 통해 파일의 바이트 단위 출력을 얻고 읽기에 혼란을 주는 내용이 있는지 확인하십시오.

관련 정보