#!/usr/bin/perl use v5.14; my %data; sub cnt_fields { my @fields = split "\t", $_[0]; return scalar @fields; } sub gather_file { state $count = 0; return $count unless @_; my ($filename, $d) = @_; open my $fh, "<", $filename; while (<$fh>) { chomp; my @field = split; my $offset = $count - cnt_fields($d->{$field[1]}); $d->{$field[1]} .= "0\t" x $offset; $d->{$field[1]} .= "$field[0]\t"; } close $fh; for my $key (keys %$d) { if (cnt_fields($d->{$key}) <= $count) { $d->{$key} .= "0\t"; } } $count++; } for (1..3) { gather_file("test$_.csv", \%data); } my $header = "Key\t"; for (1..gather_file()) { $header .= "f$_\t"; } say $header; for my $key (sort keys %data) { say "$key\t$data{$key}"; }