我想合并两个文件。
文件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
也许人们可以没有猫。