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