두 파일 병합 [중복]

두 파일 병합 [중복]

두 개의 파일을 병합하고 싶습니다.

파일 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

어쩌면 사람들은 고양이 없이도 살 수 있을지도 모릅니다.

관련 정보