use strict; my @file = qw(file1.txt file2.txt file3.txt); # read all files into one big 3D matrix my $data = []; for my $i (0 .. $#file) { open DATA, '<', $file[$i] or die; while () { chomp; my @line = split /\s+/, $_; my $linenum = shift @line; $data->[$_][$linenum][$i] = shift @line for (0..$#line); } } # output to files for each variable for my $n (0 .. $#$data) { open FILE, '>', "var$n.txt" or die; select FILE; for my $linenum (0 .. $#{$data->[$n]}) { print join "\t", $linenum, @{$data->[$n][$linenum]}, "\n"; } close FILE; } #### 0 0 1 2 3 4 5 1 0 1 2 3 4 5 2 0 1 2 3 4 5 #### 0 0 0 0 1 0 0 0 2 0 0 0 #### 0 1 1 1 1 1 1 1 2 1 1 1 #### 0 2 2 2 1 2 2 2 2 2 2 2 #### 0 3 3 3 1 3 3 3 2 3 3 3 #### 0 4 4 4 1 4 4 4 2 4 4 4 #### 0 5 5 5 1 5 5 5 2 5 5 5