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:]
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?
Aqui estão algumas maneiras:
Perl
perl -ane '$F[0]=~s/.{15}/$&\n/g; print ">$F[1]\n$F[0]\n"' file
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
awk '{ print ">"$2 ; while (length($1)) { print substr($1,1,15) ; $1=substr($1,16) } }'