shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] usando shell em sequencias de DNA


From: Tiago Peczenyj
Subject: Re: [shell-script] usando shell em sequencias de DNA
Date: Mon, 15 Mar 2010 11:04:37 -0300

Ola Graciela

Siga este guia:
http://aurelio.net/sed/sed-HOWTO/sed-HOWTO-4.html

Vejamos

/>.*/{N;s/.*\n\(...\).*/\1/p} pode ser lido como

/>.*/{comando1;comando2;...;comandoN}

ou seja, na ocorrencia da expressão '>.*' execute os comandos
limitados por { e } - esta expressão significa o sinal de > seguido
por 0, 1 ou mais caracteres quaisquer, resumindo é o sinal de >
sozinho ou não. IMHO eu usaria a expressao ^> pois estou procurando
uma linha que começa com > mas... são outros quinhentos.

Vejamos os comandos

N;
s/.*\n\(...\).*/\1/p

O comando N anexa a próxima linha no [PADRÃO], ou seja, naquilo que o
proximo comando opera

s/X/Y/

procura X no PADRÃO e substitui por Y -- neste caso foi feita o
seguinte truque: considerou-se o padrão composto por duas linhas e
trocou-se tudo isso pelo retrovisor \1 -- este retrovisor é o valor do
primeiro grupo -- o que esta entre \( e \).

Se vc tinha
> SSSSSS
1234567

o padrão, antes do N era

> SSSSSS

depois era

> SSSSSS\n1234567

passando pelo s/expressão/ foi identificado a expressão (os parentesis
são para enfatizar o grupo)

> SSSSSS\n(123)4567

então trocou-se isso pelo valor apenas do grupo

123

e então foi impresso como o comando p

Fiz um pequeno exemplo diferente, usando o comando n, que vai pra proxima linha

$ cat genetica
>1
asdasdasdsad
>2
ererewrewr
>3
asdsadwerew
>4
9herwrwrwer

$ sed -rn '/^>/{n;s/^(...).*/\1/;p}' genetica
asd
ere
asd
9he

É claro que eu poderia fazer uma 'sacanagem' semelhante com awk

$ awk -F '\n' -v RS='\n>' '{print substr($2,0,3) }' genetica
asd
ere
asd
9he

neste caso eu considero que uma nova linha seguido de > é um separador
de registros RS, assim ele le blocos ao inves de linhas. se eu
informar que o separador de campos FS é uma nova linha (ao contrario
do normal, espaços ou tabs) o que vc quer imprimir sempre ficará no
segundo campo ($2) e bastaria pegar a substring de 0 a 3 desse campo.

Qual a melhor forma? awk pode te dar matematica e estatisticas através
de sua sintaxe C-like e isso pode ser importante. sed é perfeito para
editar este fluxo de strings e pode procurar muitos tipos de
expressões. Se vc tem preocupações sobre performance eu executaria as
opções com o comando 'time' na frente.

$ time sed -n '/^>/{n;p}' genetica | cut -c1-3
asd
ere
asd
9he

real    0m0.097s
user    0m0.076s
sys     0m0.031s

$ time sed -rn '/^>/{n;s/^(...).*/\1/;p}' genetica
asd
ere
asd
9he

real    0m0.031s
user    0m0.030s
sys     0m0.015s

Perceba que, se eu quero cortar os caracteres que importam usando cut,
por exemplo, o tempo real de cpu é maior do que usando sed puro, isso
pq eu usei 2 processos conectados por um pipe e isso é custoso.

Porém nem sempre o que procuramos é cpu real o mais baixo possivel e
sim um meio termo entre legibilidade do codigo, as possibilidade de
estender o seu funcionamento e a confiabilidade do seu resultado. Se
qualquer opção executa pra vc em um piscar de olhos, eu ignoraria
qualquer comparação e ficaria com o que é mais natural para vc.

On Mon, Mar 15, 2010 at 9:38 AM, Graciela Dias <address@hidden> wrote:
> Problema resolvido, muito obrigada a todos.
>
> Douglas, o mestrado vai bem, já tou na reta final, mas quelquer dúvida é só
> entrar em contato. Seu script extrai o que eu quero, mas tá em loop.
>
> Acho que não expliquei com clareza o que eu quero, mas o Cistian e o Marcio
> conseguiram entender, valeu! :)
>
> Mas não entendi alguma coisas no comando sed -n
> '/>.*/{N;s/\(.*\)\n\(...\).*/\
>
> 1: \2/p}' dna.txt. O que seria 'N', ele pula linhas?
>
>
> Abs.
>
>
> On Sun, Mar 14, 2010 at 7:31 PM, Marcio Gil <address@hidden> wrote:
>
>>
>>
>> Resolvendo em uma linha com sed:
>>
>> $ sed -n '/>.*/{N;s/.*\n\(...\).*/\1/p}' dna.txt
>> gtg
>> atg
>> atg
>> atg
>>
>> ou, se você quiser manter o identificador da sequência:
>>
>> $ sed -n '/>.*/{N;s/\(.*\)\n\(...\).*/\1: \2/p}' dna.txt
>> >fig|674.13.peg.56: gtg
>> >fig|674.13.peg.57: atg
>> >fig|674.13.peg.58: atg
>> >fig|674.13.peg.59: atg
>>
>> Nota: Eu criei o arquivo dna.txt com o exemplo que você passou.
>>
>>
>> > -----Original Message-----
>> > From: Graciela
>> >
>> > Trabalho com bioinformática e queria tirar uma dúvida com vocês
>> > Tou com essas sequências de DNA, cada '>' representa uma sequência
>>
>> > Quero verificar apenas as três primeira letras de cada
>> > sequência, por shel script tem como?
>> >
>> > >fig|674.13.peg.56
>> > gtgacgttaggtgacaatgttgttgttgcctcgggagccgttgtgacaaagagttttggt
>> > agcaatgttgtcattggtggcaacccagcacgagtgttaaaagaaatcgagtaa
>> > >fig|674.13.peg.57
>> > atgtcaatatacccaactgcaccccaaggtgtgtcagttgatgccaatatgaaaatgata
>> > aagcaaaagtttggccgcattgttggcccaactgatttctattggttttatgaacaggtt
>> > agaaataaaggcccgtgggattataaacaaagtggcccgtttgaaaatttcggtaatttt
>> > cattatggggcagttggttatgcaggtggcattccagaagaagttttgttaagagctgct
>> > ggttgtgctcaaatgaaggcgggtacttcagctgatagctggggtagttgttggagcgat
>> > caaccatttggagatgatccaaacgatcaacgttatatagcactaggtattgaatatgca
>> > aaaagtaaaggctattag
>> > >fig|674.13.peg.58
>> > atgaacgtggataaagcgaaaaaacgcatattgaaacgagtacaaagaggtttcaaaggt
>> > tatccgcaaatatctttagagtatttcgggaaaacgacagattttgctaccgaagtagtc
>> > atcacttttgttcctgaagaaaacgctgaagcgcaaattcagagatttacgagtgataag
>> > gatgttcgtgaagatgaagcaattcaatcggtattgttgaaaattattgagcgagccgac
>> > gctgctacggttttagaaagccgagaagtatcagtttgttaa
>> > >fig|674.13.peg.59
>> > atgccagttgttggacaccttcaagtggtgacaaattgggatggtataccgatttgtatt
>> > atagaaatgacgtctgtaaccaagcaaaaatacagcgaagtaacaccggagttcgcggct
>> > ttagaaggtgagggtgacaagactttagcttggtggcgggaggcgcattggaacttcttc
>> > tcaaaagagtgcgtagagttagaaatatcaccgtcggaagatatgttgctggttctagag
>> > cagttcaaagtggtgtacaaataa
>> >
>> >
>>
>>
>>
>
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>
>
> ------------------------------------
>
> ---------------------------------------------------------------------
> Esta lista não admite a abordagem de outras liguagens de programação, como 
> perl, C etc. Quem insistir em não seguir esta regra será moderado sem prévio 
> aviso.
> ---------------------------------------------------------------------
> Sair da lista: address@hidden
> ---------------------------------------------------------------------
> Esta lista é moderada de acordo com o previsto em 
> http://www.listas-discussao.cjb.net
> ---------------------------------------------------------------------
> Servidor Newsgroup da lista: news.gmane.org
> Grupo: gmane.org.user-groups.programming.shell.brazil
>
> Links do Yahoo! Grupos
>
>
>



-- 
Tiago B. Peczenyj
Linux User #405772

http://pacman.blog.br


reply via email to

[Prev in Thread] Current Thread [Next in Thread]