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