#!/usr/bin/perl use warnings; use strict; use feature qw{ say }; my $LOAD_AT_ONCE = 500; my $filename = shift; open my $IN, '<', $filename or die $!; my @part; sub out { for my $i (0 .. $#{ $part[0] }) { open my $OUT, '>>', "$$.$i" or die $!; say {$OUT} join "\n", map $_->[$i], @part; } @part = (); } while (<$IN>) { push @part, [ split ' ' ]; out() if @part == $LOAD_AT_ONCE; print STDERR "Phase 1: ", $IN->input_line_number, "\r"; } out() if @part; print STDERR "\n"; my @files = glob "$$.*"; seek $IN, 0, 0; for my $i (0 .. $#files) { print STDERR "Phase 2: $i\r"; open my $COL, '<', "$$.$i" or die $!; while (<$COL>) { chomp; last if $_ eq 'NA'; print "$_ "; } my @rest = (split ' ', <$IN>)[ 1 + $i .. $#files ]; say "@rest"; } unlink glob "$$.*";