1

私は Perl を初めて使用します。これがこのブログでの最初の質問であり、解決されることを願っています。

フォルダーにいくつかのテキスト (10-18) ファイルがあります。すべてのファイルを読み取り、名前列に共通の変数を持つすべてのファイルと、すべてのファイルの領域列をマージしたいと考えています。例: ファイル 1.txt

名前 sim エリア Cas
aa 12 54 222
ab 23 2 343
aaa 32 34 34
bba 54 76 65

ファイル 2.txt

名前 シムエリア Cas
ab 45 45 56
abc 76 87 98
bba 54 87 87
aaa 33 43 54

ファイル 3.txt

名前 シムエリア Cas

aaa 43 54 65
ab 544 76 87
ac 54 65 76

出力は

名前 Area1 Area2 area3
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]; 
                }
            }   
        }

これを完了する方法について誰でもガイダンスを提供できますか? 前もって感謝します。

4

2 に答える 2

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
于 2013-03-25T09:35:21.427 に答える
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);
于 2013-03-25T06:46:37.490 に答える