빈 열 제거

빈 열 제거

이것은 확실히 일반적인 문제이지만 해결책을 찾을 수 없습니다. 헤더를 제외한 모든 행에 대해 완전히 비어 있는 서로 다른 열 세트가 있는 여러 파일이 있습니다. 파일에서 이러한 열을 어떻게 제거할 수 있습니까?

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

관련 정보