2012-10-26 4 views
-2

나는이 같은 상황이 :일치하는 열은

파일 2

: 나는 파일 1

파일 1

List  ID 
1   NM_00012 
2   NM_00013 
2   NM_00013 
3   NM_00021 
3   NM_00021 
4   NM_000254 
5   NM_000765 

같은 파일이처럼 보이는 두 번째 파일이

List  Count 
1   Gene1 
2   Gene2 
2   Gene2 
3   Gene3 
3   Gene3 
4   Gene4 
5   Gene5 

다음 출력을 원합니다.

3

List  Count 
NM_00012 Gene1  
NM_00013 Gene2   
NM_00021 Gene3     
NM_000254 Gene4   
NM_000756 Gene5   

누구든지 나를 도울 수있는 파일? 전 Perl을 처음 접했습니다.

미리 감사드립니다.

+1

스택 오버플로가 최선을 시도하고 찾을 수없는 프로그래머를 돕기 위해 여기에있다 해결책. 당신은 전혀 노력하지 않은 것처럼 보입니다. 귀하가 시도한 것을 보여주고 귀하의 특정 문제가 무엇인지 설명하십시오. Perl에 익숙하지 않다면 튜토리얼을 시작하는 것이 좋습니다 – Borodin

+1

예, 전적으로 동의하지만 지금이 문제를 해결해야합니다! 나는 기다릴수 없다. – Bnf8

+0

그런 다음 프로그래머를 고용해야합니다. 이것은 일을 무료로 할 수있는 곳이 아닙니다. – Borodin

답변

0

당신은 같은 뭔가 (테스트되지 않음) 할 수

my (%hash1, %hash2, $list, $count, $ID); 
open F,"<","file2.txt" or die; 
while(<F>) { 
    chomp; 
    ($list,$count) = split/\s+/; 
    $hash1{$list} = $count; 
} 
close F; 

open F,"<","file1.txt" or die; 
while(<F>) { 
    chomp; 
    ($list,$ID) = split/\s+/; 
    if(! exits $hash2{$ID}) { 
    print "$ID $hash1{$list}"; 
    $hash2{$ID} = 1; 
    } 
} 
close F; 
+0

많은 코드 중독자에게 감사드립니다! – Bnf8

1

음,이 순진하고 간단 구현 :

open FILE1, "file1.txt"; 
open FILE2, "file2.txt"; 
open OUTPUT, ">", "output.txt"; 

my (%file1content, %file2content); 

%file1content = ProcessFile(\*FILE1); 
%file2content = ProcessFile(\*FILE2); 

sub ProcessFile { 
my (%ret, @arr); 
my $fh = shift; 
while (@arr = split(/[\s\t]+/,<$fh>)) { 
next unless(scalar(@arr) == 2); 
next unless(($arr[0]+0) > 0); 
$ret{$arr[0]} = $arr[1]; 
} 
return %ret; 
} 

foreach my $key (sort {$a cmp $b} keys %file1content){ 
print OUTPUT $file1content{$key},"\t",$file2content{$key},"\n"; 
} 
close (OUTPUT); 
close (FILE1); 
close (FILE2); 
+0

도와 주셔서 대단히 감사합니다 바질! – Bnf8