2013-03-25 88 views
1

我是Perl新手,這是我希望在本博客中解決的第一個問題。根據perl中的一列合併多個文本文件

我在一個文件夾中有一些文本(10-18)文件,我想要讀取所有文件併合並所有文件中名稱列中具有公共變量的文件及其區域列。 例如: 文件的1.txt

名稱SIM區CAS大全MSDS
AA 12 54 222
AB 23 2 343
AAA 32 34 34
BBA 54 76 65

文件2.txt

名稱辛區CAS大全MSDS
AB 45 45 56
ABC 76 87 98
BBA 54 87 87
AAA 33 43 54

文件3.txt

名稱辛區CAS大全MSDS

AAA 43 54 65
AB 544 76 87
AC 54 65 76

輸出應該是

名稱區域1區域2區域3
aaa 32 43 54
ab 23 45 76

任何人都可以幫忙。我是一個非常新的Perl並且努力使用Hashes。

我已經試過這到目前爲止

use strict; 
use warnings; 

my $input_dir = 'C:/Users/Desktop/mr/'; 
my $output_dir = 'C:/Users/Desktop/test_output/'; 

opendir SD, $input_dir || die 'cannot open the input directory $!'; 
my @files_list = readdir(SD); 
closedir(SD); 

    foreach my $each_file(@files_list) 
    { 
     if ($each_file!~/^\./)    
     { 
      #print "$each_file\n"; exit; 
      open (IN, $input_dir.$each_file) || die 'cannot open the inputfile $!'; 
      open (OUT, ">$output_dir$each_file") || die 'cannot open the outputfile $!'; 

     print OUT "Name\tArea\n"; 

      my %hash; my %area; my %remaning_data; 

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


      my @line_split=split(/\t/,$line); 
      # print $_,"\n" foreach(@line_split); 

      my $name=$line_split[0]; 
      my $area=$line_split[1]; 
       } 
      } 
     } 

任何人都可以就如何完成這個指導? 在此先感謝。

回答

0
#!/usr/bin/perl 

use strict; 
use warnings; 

my $inputDir = '/tmp/input'; 
my $outputDir = '/tmp/out'; 

opendir my $readdir, $inputDir || die 'cannot open the input directory $!'; 
my @files_list = readdir($readdir); 
closedir($readdir); 

my %areas; 
foreach my $file (@files_list) { 
    next if $file =~ /^\.+$/; # skip .. 
    open (my $fh, "<$inputDir/$file"); 
    while (my $s = <$fh>) { 
     if ($s =~ /(\w+)\s+[\d\.]+\s+([\d\.]+)/) { 
      my ($name,$area) = ($1, $2); # parse name and area 
      push(@{$areas{$name}}, $area); # add area to the hash of arrays 
     } 
    } 
    close ($fh); 
} 

open (my $out, ">$outputDir/outfile"); 
foreach my $key (keys %areas) { 
    print $out "$key "; 
    print $out join " ", @{$areas{$key}}; 
    print $out "\n"; 
} 
close ($out); 
2
perl -lane '$X{$F[0]}.=" $F[2]";END{foreach(keys %X){if(scalar(split//,$X{$_})==4){print $_,$X{$_}}}}' file1 file2 file3 

測試:

> perl -lane '$X{$F[0]}.=" $F[2]";END{foreach(keys %X){if(scalar(split//,$X{$_})==4){print $_,$X{$_}}}}' file1 file2 file3 
ab 2 45 76 
aaa 34 43 54 
+0

這工作得很好非常感謝你對不起已故的答覆 – 2013-04-18 06:22:05

相關問題