2016-06-01 2 views
0

У меня есть файл данных с колонкой более 40000. В заголовке имя каждого столбца начинается с C1, c2, ..., cn, и каждый набор c имеет одно или несколько подмножеств, например c1. имеет 2 подмножества. Мне нужно удалить первый столбец (подмножество) каждого набора c. например, если вход выглядит следующим образом:Как удалить первое подмножество каждого набора столбцов в файле данных?

вход:

c1.20022 c1.31012 c2.44444 c2.87634 c2.22233 c3.00444 c3.44444 
    1 1   0   1   0   0   0   1  
    2 0   1   0   0   1   0   1  
    3 0   1   0   0   1   1   0  
    4 1   0   1   0   0   1   0  
    5 1   0   1   0   0   1   0  
    6 1   0   1   0   0   1   0  

Мне нужен выход быть как:

c1.31012 c2.87634 c2.22233 c3.44444 
    1 0   0   0   1  
    2 1   0   1   1  
    3 1   0   1   0  
    4 0   0   0   0  
    5 0   0   0   0  
    6 0   0   0   0  
    7 1   0   0   0  

Любые предложения, пожалуйста?

update: Если между цифрами в строке (которая является реальной ситуацией моего набора данных) не существует пробела, то что мне делать? мои средний, что мои реальные данные выглядят следующим образом: входа:

c1.20022 c1.31012 c2.44444 c2.87634 c2.22233 c3.00444 c3.44444 
     1 1010001  
     2 0100101  
     3 0100110  
     4 1010010  
     5 1010010  
     6 1010010  

и выход:

c1.31012 c2.87634 c2.22233 c3.44444 
     1 0001  
     2 1011  
     3 1010  
     4 0000  
     5 0000  
     6 0000  
     7 1000  
+0

петли через первый ряд, записать номер столбца для первого заголовка каждого подмножества в списке (или в качестве ключа в хэш). Затем пропустите все строки и пропустите все столбцы и пропустите любой столбец, который находится в списке. – Barmar

ответ

2

решение Perl: сначала читает строку заголовка, использует регулярное выражение для извлечения имени столбца, прежде чем точка и хранит список номеров столбцов. Затем он использует индексы для печати только требуемых столбцов из заголовка и оставшихся строк.

#!/usr/bin/perl 
use warnings; 
use strict; 
use feature qw{ say }; 

my @header = split ' ', <>; 
my $last = q(); 
my @keep; 
for my $i (0 .. $#header) { 
    my ($prefix) = $header[$i] =~ /(.*)\./; 
    if ($prefix eq $last) { 
     push @keep, $i + 1; 
    } 
    $last = $prefix; 
} 
unshift @header, q(); 
say join "\t", @header[@keep]; 

while (<>) { 
    my @columns = split; 
    say join "\t", @columns[@keep]; 
} 

Обновление:

#!/usr/bin/perl 
use warnings; 
use strict; 
use feature qw{ say }; 

my @header = split ' ', <>; 
my $last = q(); 
my @keep; 
for my $i (0 .. $#header) { 
    my ($prefix) = $header[$i] =~ /(.*)\./; 
    if ($prefix eq $last) { 
     push @keep, $i; 
    } 
    $last = $prefix; 
} 
say join "\t", @header[@keep]; 

while (<>) { 
    my ($line_number, $all_digits) = split; 
    my @digits = split //, $all_digits; 
    say join "\t", $line_number, join q(), @digits[@keep]; 
} 
+0

спасибо. если между цифрами в строке нет вкладки, то как мне изменить программу для этого? на самом деле в моих реальных данных, кроме заголовка, в последовательной строке все цифры находятся рядом друг с другом, например: first row: 0001. так что в этом случае часть программы должна быть изменена? – zara

+0

@zara: Вам нужно будет удалить номер строки, затем разделить на '//' и не присоединяться к '' \ t "', а использовать '' '' или 'q()'. – choroba

+0

, когда я запускаю первый скрипт в своих реальных данных, я получаю эту ошибку: использование неинициализированного значения в join или string в строке ./first.perl 21, <> line 3986. Можете ли вы посоветовать мне, как я могу выехать из эта ошибка? мои данные имеют 3986 строк. это может быть проблемой? – zara

Смежные вопросы