2013-03-25 3 views
1

Я новичок в Perl, и это мой первый вопрос в этом блоге, надеюсь, будет решен.Слияние нескольких текстовых файлов на основе одного столбца в perl

У меня есть некоторые текстовые (10-18) файлы в папке, я хочу прочитать все файлы и объединить все файлы, которые имеют общие переменные в столбце Имена вместе со своим столбцом «Область» для всех файлов. Например: файл 1.txt

Имя сим Площадь Cas
аа 12 54 222
AB 23 2 343
ааа 32 34 34
BBA 54 76 65

файл 2.txt

Имя Сим Площадь Cas
AB 45 45 56
аЬс 76 87 98
BBA 54 87 87
ааа 33 43 54

файл 3.txt

Имя Сим Площадь Cas

ааа 43 54 65
AB 544 76 87
переменного тока 54 65 76

Выход должен быть

Наименование Площадь1 Площадь2 Площадь3
aaa 32 43 54
ab 23 45 76

Может кто-нибудь помочь в этом. Я очень новичок в Perl и изо всех сил пытаюсь использовать хеши.

Я попытался это до сих пор

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

Это работает отлично спасибо очень жаль последнего ответа –

Смежные вопросы