Предполагая, что файлы отсортированы по столбцу имени, это действительно легко сделать благодаря программе join (1) :
$ join --header -t $'\t' -o 2.1,2.2,1.4 -1 2 -2 1 file1.tsv file2.tsv
Name Type Column2
A1 1 AB
A2 1 CD
B1 2 EF
B2 1 GH
Параметр --header
представляет собой расширение GNU, которое исключает объединение первых строк двух файлов и рассматривает их как заголовки столбцов. -t
устанавливает разделитель столбцов, -o
контролирует, какие столбцы включаются в вывод (список спецификаторов FILE.COLUMN), а -1
и -2
выбирают столбцы, которые используются для объединения двух файлов.
Если они не отсортированы или если вы настроены на Perl, ваш код выглядит очень-очень близко; Помимо всех опечаток и тому подобного, вы распечатываете все столбцы, а не только те, которые вы хотите получить. Рассмотрим:
#!/usr/bin/perl
use warnings;
use strict;
use feature qw/say/;
use autodie;
my %names;
sub read_file {
my ($file, $idx) = @_;
open my $in, "<", $file;
my $header = <$in>;
while (<$in>) {
chomp;
my @F = split /\t/;
push @{$names{$F[$idx]}}, \@F;
}
}
read_file "file1.tsv", 1;
read_file "file2.tsv", 0;
say "Name\tType\tColumn2";
for my $n (sort keys %names) {
my $row = $names{$n};
say "$n\t$row->[1][1]\t$row->[0][3]";
}
Я также подозреваю, что ваш странный вывод может быть объяснен запуском вашей программы на файлах данных, использующих окончания строк в стиле Windows, когда ваша ОС использует окончания строк в стиле Unix.