Dividir uma coluna em várias colunas de acordo com uma string específica de acordo com o número irregular de itens entre cada string

0

Eu tenho um arquivo com uma coluna exclusiva e gostaria de dividir essa coluna em várias colunas de acordo com uma string específica (chr). O número de itens entre a primeira string e a segunda, a segunda e a terceira, o n e o m ... não são regulares.

A entrada é assim:

chr10:127293562-127293909
BRUNOL4(Hs/Mm)
CPEB4(Hs/Mm)
CUG-BP(Hs/Mm)
DAZAP1(Hs/Mm)
ENOX1(Hs/Mm)
FMR1(Hs/Mm)
chr11:49214073-49214804
BRUNOL4(Hs/Mm)
BRUNOL5(Hs/Mm)
CPEB2(Hs/Mm)
CPEB4(Hs/Mm)
CUG-BP(Hs/Mm)
HNRNPC(Hs/Mm)
HNRNPCL1(Hs/Mm)
HNRNPH1(Hs/Mm)
HuR(Hs/Mm)
MBNL1(Hs/Mm)
NOVA1(Hs/Mm)
chr11:49854587-49855127
A1CF(Hs/Mm)
BRUNOL4(Hs/Mm)

A saída deve ficar assim:

chr10:127293562-127293909  chr11:49214073-49214804  chr11:498547-498551
BRUNOL4(Hs/Mm)             BRUNOL4(Hs/Mm)           A1CF(Hs/Mm)
CPEB4(Hs/Mm)               BRUNOL5(Hs/Mm)           BRUNOL4(Hs/Mm)
CUG-BP(Hs/Mm)              CPEB2(Hs/Mm)
DAZAP1(Hs/Mm)              CPEB4(Hs/Mm)    
ENOX1(Hs/Mm)               CUG-BP(Hs/Mm)
FMR1(Hs/Mm)                HNRNPC(Hs/Mm)
                           HNRNPCL1(Hs/Mm)
                           HNRNPH1(Hs/Mm)
                           HuR(Hs/Mm)
                           MBNL1(Hs/Mm)
                           NOVA1(Hs/Mm)
    
por fusion.slope 21.09.2016 / 11:38

2 respostas

1
$ csplit -zsf file -n 1 ip.txt /^chr/ {*} ; paste file* | column -nt
chr10:127293562-127293909  chr11:49214073-49214804  chr11:49854587-49855127
BRUNOL4(Hs/Mm)             BRUNOL4(Hs/Mm)           A1CF(Hs/Mm)
CPEB4(Hs/Mm)               BRUNOL5(Hs/Mm)           BRUNOL4(Hs/Mm)
CUG-BP(Hs/Mm)              CPEB2(Hs/Mm)             
DAZAP1(Hs/Mm)              CPEB4(Hs/Mm)             
ENOX1(Hs/Mm)               CUG-BP(Hs/Mm)            
FMR1(Hs/Mm)                HNRNPC(Hs/Mm)            
                           HNRNPCL1(Hs/Mm)          
                           HNRNPH1(Hs/Mm)           
                           HuR(Hs/Mm)               
                           MBNL1(Hs/Mm)             
                           NOVA1(Hs/Mm)             
  • csplit usado para dividir arquivos com base em um padrão
    • -z opção para excluir arquivos vazios (para casos como a própria primeira linha de correspondência de padrões)
    • -s suprime a saída do log
    • -f file -n 1 nome dos arquivos de saída começam com file e sufixo de dígito único
    • ip.txt é o arquivo de entrada, /^chr/ é padrão para trabalhar em
    • {*} o maior número possível de divisões
  • paste é então usado para concatenar os arquivos divididos na coluna
  • column -nt usado para estilizar a saída da colagem, -n impede que o comportamento padrão de column mescle delimitadores adjacentes e uma extensão GNU
por 22.09.2016 / 07:24
0

Com sem nenhum canal:

#!/usr/bin/env perl

use strict; use warnings;

my $c = -1; my $arr = [];

while (<>) {
    if (/^chr/) {$c++};
    chomp;
    push(@{ $arr->[$c] }, $_);
}

foreach my $i (0...scalar(@{ $arr->[1] }) -1) {
    printf("%-30s %s\n", $arr->[0]->[$i], $arr->[1]->[$i]);
}

OUTPUT

chr10:127293562-127293909      chr11:49214073-49214804
BRUNOL4(Hs/Mm)                 BRUNOL4(Hs/Mm)
CPEB4(Hs/Mm)                   BRUNOL5(Hs/Mm)
CUG-BP(Hs/Mm)                  CPEB2(Hs/Mm)
DAZAP1(Hs/Mm)                  CPEB4(Hs/Mm)
ENOX1(Hs/Mm)                   CUG-BP(Hs/Mm)
FMR1(Hs/Mm)                    HNRNPC(Hs/Mm)
    
por 21.09.2016 / 21:37