1

複数の行から読み取り、これに対応する単一の行を持つ新しいファイルを作成するような方法でファイルを処理したい。

例: 入力ファイル:

12345   1   -   -   -

12346   -   2   -   4

12347   -   -   3   -

12348   5   -   -   -

12349   -   6   -   8

12350   -   -   7   -

出力ファイル:

12346   1   2   3   4

12349   5   6   7   8

完全な列を作るために3行を取ります。

perlでこれを行う方法は?

4

4 に答える 4

3

3つの簡単なステップでそれを行います:

  1. 最初の単語をキーとしてハッシュを作成します。

  2. ファイルから読み取り、入力を配列に保持します。

  3. 各キーに対して要素を新しいファイルに出力します。

于 2013-12-02T04:37:49.627 に答える
1

説明があれば、これが役立つと思います:

入力ファイルは次のとおりです。

12345|1|-|-|-
12346|-|2|-|4
12347|-|-|3|-
12348|5|-|-|-
12349|-|6|-|8
12350|-|-|7|-

脚本

use strict;
use warnings;
sub processor{
(my @tmp )=@_;
        my @inner;
        shift(@tmp);
            foreach my $element(@tmp){
                $_=$element;
                if((m/[0-9]/)){
                    push(@inner,$element);
                }
            }
return @inner;
}
open(INFILE,"infile.dat") or die "$!";
open(OFILE,">outfile.dat") or die "$!";
my @ecollector;
my $keyVal;
my $counter;
while(<INFILE>){
        chomp($_);
        my @tmp=split('\|',$_);
        if(($. % 3) ne 0){
            if(($. % 3) eq 2){ $keyVal=$tmp[0];}
            push(@ecollector,processor(@tmp));
        }
        else{
            push(@ecollector,processor(@tmp));
            print OFILE "$keyVal\t".join("\t",sort(@ecollector))."\n";
            @ecollector=();
        }   
}
close(INFILE);
close(OFILE);
于 2013-12-02T10:22:37.467 に答える