Excluir colunas em branco

2

Este deve ser um problema comum, mas não consegui encontrar uma solução. Eu tenho vários arquivos que têm diferentes conjuntos de colunas que são completamente em branco (para todas as linhas, exceto cabeçalho), como posso excluir essas colunas dos arquivos?

col1    col2    col3    col4    col5    col6
 1       2                3              43
         1                3               3

Portanto, não quero col3 e col5 na saída, pois estão em branco.

Por favor ajude.

Esta é a saída desejada. Os arquivos são delimitados por tabulações.

col1    col2    col4    col6
1        2      3        43
         1      3         3
    
por Hia Sen 26.05.2015 / 15:42

2 respostas

2

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;
}
    
por 26.05.2015 / 16:05
1

Você não solicitou , mas isso é muito divertido :

ruby -rcsv -e '
  columns = CSV.read(ARGV.shift, :col_sep => "\t").transpose 
  trimmed = columns.select {|col| col if col[1..-1].find {|elem| not elem.nil?}}
  trimmed.transpose.each {|row| puts row.join("\t")}
' file 

produz

col1    col2    col4    col6
1       2       3       43
        1       3       3
    
por 26.05.2015 / 20:33