あなたは 1 から 5 の数字があると言っていますが、これは、私が見る限り、あなたが望む出力とは無関係です。ファイルで見つかった数値のみを出力に使用します。このコードはあなたが望むことをします:
use strict;
use warnings;
use feature 'say';
my @hashes;
my %seen;
local $/; # read entire file at once
while (<>) {
my @nums = split; # split file into elements
$seen{$_}++ for @nums; # dedupe elements
push @hashes, { map { $_ => $_ } @nums }; # map into hash
}
my @all = sort { $a <=> $b } keys %seen; # sort deduped elements
# my @all = 1 .. 5; # OR: provide hard-coded list
for my $num (@all) { # for all unique numbers
my @fields;
for my $href (@hashes) { # check each hash
push @fields, $href->{$num} // "NA"; # enter "NA" if not found
}
say join "\t", @fields; # print the fields
}
のソートされた重複排除済みリストを、他の有効なリストに置き換えることができ@all
ます。my @all = 1 .. 5
次に、それらの数値の行を追加し、欠落している値の追加の「NA」フィールドを出力します。
また、これはファイルの内容が数値であるという事実に依存していることに注意する必要がありますが、@all
配列のソートに関してのみであるため、独自のリストまたは独自のソートルーチンに置き換えると、任意の値を使用します。
このスクリプトは、任意の数のファイルを取得して処理します。例えば:
$ perl script.pl f1.txt f2.txt f3.txt
1 NA 1
3 3 NA
NA 4 NA
5 NA 5
OP の意味を理解したBrent Stewartの功績によるものです。