Solução Perl, adequada para arquivos menores que podem caber na memória. Para arquivos maiores, você precisaria processar o arquivo duas vezes. Eu assumi que os arquivos de entrada são separados por tabulações.
O hash %empty
mantém a lista de índices das colunas vazias. Se uma coluna estiver preenchida, ela será removida do hash. Assim, uma vez que o arquivo inteiro é salvo no @array, o% vazio contém exatamente as colunas que nunca foram preenchidas.
#! /usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
chomp(my @header = split "\t", <>);
my %empty;
@empty{ 0 .. $#header } = (1) x @header; # Start with ones for each column.
my @array;
while (<>) {
chomp;
push @array, [ split "\t" ];
undef $empty{$_} for grep length $array[-1][$_], 0 .. $#header;
}
for my $line (\@header, @array) {
say join "\t",
map $line->[$_] // q(), # Turn uninitialized values to empty strings.
grep ! $empty{$_},
0 .. $#header;
}