空の列を削除

空の列を削除

これは確かに一般的な問題ですが、解決策が見つかりません。ヘッダーを除くすべての行に対して完全に空の異なる列セットを持つ複数のファイルがあります。ファイルからこれらの列をどのように削除できますか?

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ソリューションです。大きなファイルの場合は、ファイルを2回処理する必要があります。入力ファイルがタブで区切られているとします。

ハッシュは%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;
}

おすすめ記事