![删除空白列](https://linux22.com/image/65731/%E5%88%A0%E9%99%A4%E7%A9%BA%E7%99%BD%E5%88%97.png)
这肯定是一个常见问题,但我找不到解决方案。我有几个文件,其中有不同的列集,这些列集完全空白(对于除标题之外的所有行),如何从文件中删除这些列?
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