Dividindo uma sequência em largura fixa

3

Eu tenho um arquivo como este, que é um arquivo separado por tabulações de duas colunas.

CTGCAGTTTCCCCAAATGTGGGAAACTTGACTGTATAATTTGTGGCAGTGGTA   a1
GATTTCCCCAAATGTGGGAAACTCACTCGGCAGGCGTTGATA  a2

Eu quero obter uma saída como esta:

>a1
CTGCAGTTTCCCCAAATGTG
GGAAACTTGACTGTATAATT
TGTGGCAGTGGTA
>a2
GATTTCCCCAAATGTGGGAA
ACTCACTCGGCAGGCGTTGA
TA

Eu estava tentando usar o comando fold dentro do awk . É possível usar outro comando em awk ?

Além disso, a largura de cada linha que eu quero é 15, então eu tentei algo assim, mas não funcionou:

awk -F "\t" '{a=$(fold -w 50 $1);print a,$2}' file.txt 

Como posso fazer isso?

    
por user3138373 10.03.2015 / 19:48

3 respostas

3

Com python test.py < input e test.py :

import sys
for i in sys.stdin:
     s, ident = i.rstrip().split()
     print '>{0}'.format(ident)
     while s:
          print s[:15]
          s = s[15:]
    
por 10.03.2015 / 19:56
5

Aqui estão algumas maneiras:

  1. Perl

    perl -ane '$F[0]=~s/.{15}/$&\n/g; print ">$F[1]\n$F[0]\n"' file 
    
  2. awk

    awk '{i=0; printf ">%s\n",$2;
           while(i<=length($1)){
                printf "%s\n", substr($1,i,15);i+=15
            }}' file
    

Se você realmente quiser usar fold no awk, pode fazer

awk '{printf ">%s\n",$2; system("echo " $1 "| fold -w 15 ") }' file

Sua tentativa falhou porque $() é uma coisa de shell, não uma coisa awk . Para executar comandos do sistema a partir de awk , você precisa usar system() . Então, para passar o valor de $1 (a sequência) e não a string real $1 para o shell (se você fizer isso, o shell tentará e avaliará e retornará um espaço em branco, pois $1 não está definido), você precisa excluir $1 das aspas.

Então, neste exemplo, estou usando

               |-------------------------> closing quotes for the 1st part
               |                    |----> closing quotes for the 2nd part
               v                    v   
system( " echo "  $1  " | fold -w 15")
        - ----    --- - ------------
        |  |       |  |       |----------> the 2nd part
        |  |       |  |------------------> opening quotes for the 2nd part       
        |  |       |---------------------> The awk variable, '$1', 
        |  |                               outside the quotes.         
        |  |-----------------------------> The 1st part       
        |--------------------------------> opening quotes for the 1st part
    
por 10.03.2015 / 19:59
3
awk '{ print ">"$2 ; while (length($1)) { print substr($1,1,15) ; $1=substr($1,16) } }'
    
por 10.03.2015 / 20:03