2つのファイルを結合する[重複]

2つのファイルを結合する[重複]

2つのファイルをマージしたいです。

ファイル1

C       45      897
E       76      348
G       78      456

ファイル2

A       54      987
B       34      986
C       67      340
E       46      987
F       34      567

以下のようにファイル3にマージする必要があります。

A       0       0       54      987
B       0       0       34      986
C       45      897     67      340
E       76      348     46      987
F       0       0       34      567
G       78      456     0       0

答え1

男性が参加し、いくつかは試みる

join -e 0 -a 1 a b
A 0 0 54 987
B 0 0 34 986
C 45 897 45 897 67 340
E 76 348 76 348 46 987
F 0 0 34 567
G 78 456 78 456 0 0
  • -e 0不足している列を埋める
  • -a 2ファイル1にデータを保持

答え2

各レコードの4要素配列であるハッシュ配列(%L)に文字値の各行を格納します。すべてのファイルを読み取ったら、未定義の各値を0に設定し、%Lに各文字の配列を印刷します。

アルゴリズムはより多くの入力ファイルに拡張されます(各追加ファイルは元の4列配列の列数を2ずつ増やします)。

#! /usr/bin/perl

use strict;

my %L=();

my @files = ('file1', 'file2');
my $fcount = 0;

foreach my $f (@files) {
  open(F,"<",$f) || die "couldn't open $f: $!\n";
  while(<F>) {
    my($l, $x, $y) = split;
        $L{$l}[$fcount * 2] = $x;
        $L{$l}[$fcount * 2 + 1] = $y;
  };
  close(F);
  $fcount++;
};

foreach my $l (sort keys %L) {
    foreach (0..3) { $L{$l}[$_] = 0 if !defined($L{$l}[$_])};
    print join("\t",$l,@{ %L{$l} }), "\n";
}

出力は次のとおりです。

$ ./merge.pl 
A   0   0   54  987
B   0   0   34  986
C   45  897 67  340
E   76  348 46  987
F   0   0   34  567
G   78  456 0   0

答え3

修正する: 質問を誤って読みましたが、これは問題の解決策ではありません。

次のようにする必要があります。

cat file1 file2 | sort > newfile

たぶん人々は猫なしで生きることができるかもしれません。

関連情報