divide o conteúdo de uma coluna específica

2

Eu preciso dividir o conteúdo da segunda coluna do meu file em duas colunas, por exemplo:

Id  allele  id2
30  TC  12      
211 GG  12      
327 AA  13      
688 TC  15      
760 TT  18      
868 CC  90 

A saída deve ser:

Id  allele1 allele2 id2
30  T   C   12      
211 G   G   12      
327 A   A   13      
688 T   C   15      
760 T   T   18      
868 C   C   90      
    
por Paul 07.10.2015 / 18:15

5 respostas

3

com awk :

awk 'NR==1{$2=$2"1 "$2"2"} NR!=1{split($2,a,""); $2=a[1]" "a[2];}1' file
  • NR==1 aplica-se apenas à primeira linha
    • $2=... : reformatar o segundo campo como cabeçalho com allele1 allele2
  • NR!=1 aplica-se a todas as outras linhas.
    • split($2,a,"") divide o segundo campo $2 na matriz a
    • $2=a[1]" "a[2]; : reformate o segundo campo com os dois valores parcelados a[1] e a[2] .
  • O 1 no final faz uma condição verdadeira em que awk imprime toda a linha (manipulada)

Se você quiser que ele seja em colunas, use este awk ... | column -t . A saída parece então:

Id   allele1  allele2  id2
30   T        C        12
211  G        G        12
327  A        A        13
688  T        C        15
760  T        T        18
868  C        C        90
    
por 07.10.2015 / 18:43
2

Aqui está outro sed :

sed '1!s/  *./&\t/;t
       s/a.*e/&1 &2/          
'    <infile >outfile

Talvez seja necessário usar um caractere > real em oposição ao escape \t usado aqui.

Isso funciona se as colunas estiverem divididas em espaços. Se eles são, na verdade, caracteres dividindo as colunas, então é necessário alterar um pouco.

sed '1!s/\t./&\t/;t
       s/a.*e/&1 &2/          
'    <infile >outfile

... com as mesmas anotações de antes sobre a possibilidade de precisar de um literal no lugar do escape de barra invertida \ .

Id      allele1 allele2 id
30      T       C       12
211     G       G       12
327     A       A       13
688     T       C       15
760     T       T       18
868     C       C       90
    
por 08.10.2015 / 11:40
2
$ cat file|sed -e 's,\([^ ]*\)[ ]*\(.\)\(.\),  ,' -e '1 s/a llele/allele1 allele2/'
Id allele1 allele2 id2
30 T C  12
211 G G  12
327 A A  13
688 T C  15
760 T T  18
868 C C  90
    
por 07.10.2015 / 18:41
1

A seguir, os dados do seu arquivo serão coletados, divididos e salvos no novo arquivo.

./split.py <filename> <newfilename>

#!/usr/bin/python

import sys

file = open(sys.argv[1],'r')
list = file.readlines()

headerstart = list[0].split('\t')
header = headerstart[0] + '\t' + headerstart[1] + '1\t' + headerstart[1] + '2\t' + headerstart[2]


def makeList(input):
        out = []
        for y in list[1:]:
                x = y.split('\t')
                out.append(x[0] + '\t' + x[1][0] + '\t' + x[1][1] + '\t' + x[2])
        return out


file = open(sys.argv[2],'w')

file.write(header)
for x in makeList(list):
        file.write(x)

file.close()

você pode executá-lo com argumentos padrão com ./split.py <filename> <newfilename>

Ele pegará a lista de arquivos, dividirá-a com base na guia \t , depois dividirá a segunda coluna pela metade e separará por guia e a salvará em newfilename

Essa resposta pode ser modificada para atender a outros requisitos, se informações diferentes forem fornecidas.

output

Id      allele1 allele2 id2

30      T       C       12

211     G       G       12

327     A       A       13

688     T       C       15

760     T       T       18

868     C       C       90
    
por 07.10.2015 / 18:39
1

Usando o Perl:

perl -lane '$,="  ";@F[1]=~s/./$&  /;print(@F)' in
 cat in
30  TC  12      
211 GG  12      
327 AA  13      
688 TC  15      
760 TT  18      
868 CC  90 
% perl -lane '$,="  ";@F[1]=~s/./$&  /;print(@F)' in
30  T  C  12
211  G  G  12
327  A  A  13
688  T  C  15
760  T  T  18
868  C  C  90
    
por 08.10.2015 / 11:54