删除空白列

删除空白列

这肯定是一个常见问题,但我找不到解决方案。我有几个文件,其中有不同的列集,这些列集完全空白(对于除标题之外的所有行),如何从文件中删除这些列?

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

所以我不希望输出中出现 col3 和 col5,因为它们是空白的。

请帮忙。

这是所需的输出。文件以制表符分隔。

col1    col2    col4    col6
1        2      3        43
         1      3         3

答案1

Perl 解决方案,适用于可装入内存的较小文件。对于较大的文件,您需要处理该文件两次。我假设输入文件是制表符分隔的。

哈希%empty保留空列的索引列表。如果某列已填充,则会将其从哈希中删除。因此,一旦整个文件保存到 @array 中,%empty 就包含从未填充的列。

#! /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;
}

答案2

你没有要求,但这很有趣:

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 

产生

col1    col2    col4    col6
1       2       3       43
        1       3       3

相关内容