Dividir uma coluna em várias colunas de acordo com uma string específica

1

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)

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)

A saída deve ficar assim:

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)

Qualquer ideia seria realmente apreciada.

    
por fusion.slope 21.09.2016 / 10:40

2 respostas

2
awk '/^chr/{i++} 
           {print > "_aux" i }
       END {system( "paste _aux* | column -tn; rm _aux*")}' file
  • as duas primeiras linhas (com print > "_aux" i ), divida a entrada em um conjunto de arquivos _aux1 ... _auxn (cada arquivo = uma coluna)
  • no final, paste _aux* | column -tn cola e formata as partes.

Esta solução pode lidar com várias colunas (espero).

    
por 21.09.2016 / 13:54
1

É um problema típico do awk:

#!/usr/bin/awk -f
BEGIN{ col = -1; l = 0; r = 0; width = 0; }
/^chr[0-9]+:/ {
        ++col;
}
{
        if ( col == 0 ) {
                L[l++] = $0;
        } else {
                R[r++] = $0;
        }
        if ( length ($0) > width ) {
                width = length ($0) ;
        }
}
END {
        for ( i = 0; i < l; ++i ) {
                printf "%-*s %s\n", width, L[i], R[i];
        }
}

Chame esse script de "foo" e torne-o executável, e canalize seus dados para ele:

./foo < foo.in

dando

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)

Isso pressupõe que as colunas esquerda / direita tenham o mesmo número de itens e que você tenha apenas duas colunas. O awk possui apenas matrizes unidimensionais. Se o seu problema exigir mais colunas (digamos, um número arbitrário), a solução em awk (ou preferencialmente em perl) seria mais complicada. Para isso, você precisaria de uma pergunta mais clara para resolver como fazer isso .

    
por 21.09.2016 / 11:02