合并两个文件

合并两个文件

我想合并两个文件。

文件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

将每行字母值存储在散列数组 (%L) 中,每个记录都是一个 4 元素数组。读取所有文件后,将每个未定义的值设置为 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

也许人们可以没有猫。

相关内容