[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