-2

私はこのような状況にあります:私はfile1のようなファイルを持っています

file1

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

次のような2番目のファイル:

file2

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の初心者です。

前もって感謝します!!

4

2 に答える 2

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);
于 2012-10-26T13:54:51.897 に答える
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;
于 2012-10-26T13:02:03.873 に答える