2014-02-18 2 views
1

Perl 프로그램을 작성하고 싶습니다. 첫 번째 입력 파일은 2 열의 텍스트입니다. 첫 번째 열은 레이블이고 두 ​​번째 열은 검색 문자열입니다. 두 번째 입력 파일에는 두 개의 열도 있습니다. 첫 번째 열은 레이블이고 두 ​​번째 열은 검색 할 텍스트입니다. 예를 들어 두 번째 열에 따르면 John (file1)은 John보다 file2의 Johni와 더 유사합니다. 출력Perl에서 부분 일치하는 두 파일 찾기

Jami EWWQQQQQQQERRRTTTTTTTTTT Jam WWQQQQQQQERRRTTTTTT 
Johni AAAAABBBCCCDEEEEEEHHHHHH John AABBBCCCDEE 

Jami EWWQQQQQQQERRRTTTTTTTTTT 
Johni AAAAABBBCCCDEEEEEEHHHHHH 
Mark WWWCCVVVVVVFFFFFFFTTTTTT 
ROB  ##@@@########VVVVVVVVVVV 
John WWADFRWSSSSSSDDDDDqqqqqq 

파일 2

John AABBBCCCDEE 
Jam WWQQQQQQQERRRTTTTTT 

파일 1

나는 다음 코드를 시도했지만 내가 원하는 방식으로 작동하지 않습니다.

#!/user/bin/perl 
use warnings; 
use strict; 

my ($infile1) = $ARGV[0]; 
my ($infile2) = $ARGV[1]; 
open(my $fh1, "<$infile1"); 

while(my $file1 = <$fh1>){ 

my @file1 = split ("\t| ", $file1); 
my $name_file1 = $file1[0]; 
my $ID_file1 = $file1[1]; 
my @matchline_file2 = `cat $infile2 | grep $name_file1`; 
for my $ID_file1 (@file1){ 
     if (grep my $ID_file2 eq $ID_file1, @matchline_file2){ 
     print "found\n";}else{print "not_found\n";}}} 
+0

"가장 일치하는 항목"을 선택하려면 다소 복잡한 문자열 비교 알고리즘을 사용하는 것처럼 들립니다. – TLP

+0

@TLP 두 번째 열 – EpiMan

+0

에 따라 가장 일치하는 것을 의미했습니다. 따라서 각 경우에 파일 1의 줄은 file2의 줄의 하위 집합입니까? – Jeef

답변

1

결과가 출력과 반대 순서로 인쇄되지 않습니다. 그게 의도적인지 확실하지 않습니다. 원하는 경우 배열에 결과를 저장하고 순서를 바꾸거나 정렬 할 수 있습니다. 귀하의 예는 매우 제한되어 있으며 이것은 당신이하려는 것을 가장 잘 예측 한 것입니다.

#!/usr/bin/perl 
use warnings; 
use strict; 

my ($infile1) = $ARGV[0]; 
my ($infile2) = $ARGV[1]; 

my $search_file = ""; 
open(my $fh2, "<$infile2"); 

while(my $line = <$fh2>) 
{ 
    $search_file .= $line; 
} 

open(my $fh1, "<$infile1"); 

while(my $line = <$fh1>) 
{ 
    chomp($line); 

    if($line =~ m/\w+\s+(.*)/) 
    { 
     my $search_string = quotemeta("$1"); 

     if($search_file =~ m/(.*$search_string.*)/) 
     { 
      print "$1\t$line\n"; 
     } 
     else 
     { 
      print "Could not find: $line\n"; 
     } 
    } 
    else 
    { 
     print "Invalid line: $line\n"; 
    } 
} 
+0

[$ index]) (http://perldoc.perl.org/functions/index.html) 함수를 사용하여 '$ needle'의 하위 문자열을 찾을 수 있습니다. '$ haystack' 문자열. 'index ($ haystack, $ needle)> = 0'입니다. – chansen

+0

@chansen 예. 그러나 정규 표현식을 사용하여 하위 문자열이 발생한 전체 행을 얻는 것이 더 쉬워 보입니다. –

+1

그런 다음 [quotemeta] (http://perldoc.perl.org/functions/quotemeta.html) 함수 또는 '\ Q ... \ E' 함수를 사용하여 문자열을 정규 표현식으로 삽입 할 때 메타 문자를 인용/이스케이프해야합니다 표현. – chansen

관련 문제