Eu tenho esse arquivo:
m64071_220512_054244/12584899/ccs rev pet047-10055 ACGTGCGACCTTGTGA TTGAGGGTTCAAACGTGCGACCTTGTGA
m64071_220512_054244/128321000/ccs rev pet047-10055 ACGTGCGACCTTGTGA TTGAGGGTTCAAACGTGCGACCTTGTGA
m64071_220512_054244/132186699/ccs fwd pet047-10055 TCACAAGGTCGCACGT TCACAAGGTCGCACGTTTGAACCCTCAA
m64071_220512_054244/134874748/ccs fwd pet047-10055 TCACAAGGTCGCACGT TCACAAGGTCGCACGTTTGAACCCTCAA
Eu preciso tr
e reverse
os campos $4 e $5 somente se$2==rev
Esperar :
m64071_220512_054244/12584899/ccs rev pet047-10055 TCACAAGGTCGCACGT TCACAAGGTCGCACGTTTGAACCCTCAA
m64071_220512_054244/128321000/ccs rev pet047-10055 TCACAAGGTCGCACGT TCACAAGGTCGCACGTTTGAACCCTCAA
m64071_220512_054244/132186699/ccs fwd pet047-10055 TCACAAGGTCGCACGT TCACAAGGTCGCACGTTTGAACCCTCAA
m64071_220512_054244/134874748/ccs fwd pet047-10055 TCACAAGGTCGCACGT TCACAAGGTCGCACGTTTGAACCCTCAA
Tentei :
perl -lpe 'if(/rev/) {$rev=/rev/;next}; if ($rev) {$F[4,5]=~tr/ATGC/TACG/; $F[4,5]=reverse $F[4,5]; print "@F"}' file
Eu também tentei usar o awk ( Execute o comando bash dentro do awk e imprima a saída do comando )
awk '{
if($2==rev)
{
cmd1="echo \047" $4 "\047 | rev | tr \047ATGC\047 \047TACG\047"
cmd2="echo \047" $5 "\047 | rev | tr \047ATGC\047 \047TACG\047"
newVar1=((cmd1 | getline line) > 0 ? line : "failed")
newVar2=((cmd2 | getline line) > 0 ? line : "failed")
close(cmd)
print $1, $2, $3, newVar1, newVar2
}
else {print}
}' file
Para seguir a tentativa da pergunta:
Posso colocar isso em uma linha (ou copiar e colar como está na maioria dos shells), espalhei-o para facilitar a leitura. Ou coloque em um programa, claro, principalmente se houver mais o que fazer.
Editar - comentários sobre o código da pergunta
Para dividir a string de entrada no
@F
array (" autosplit "), é necessário-a
sinalizarComo você está imprimindo explicitamente o que é necessário, use
-n
o sinalizador, não-p
Os campos 4 e 5 na linha são os elementos 3 e 4 da matriz
Presumo que
$F[4,5]
você queira dizer os dois elementos da matriz (que devem ser 3,4). Isso, então, deveria ser@F[3,4]
- e com-w
bandeira, como aviso, ouviríamos sobre issoMais importante ainda, não podemos vincular uma expressão regular ou
tr
padrão a uma lista, mas apenas a um único escalar. Para aplicar issotr
a vários itens, é necessário iterar sobre eles, como acima.O código no bloco desse loop sobre os
@F[3,4]
elementos é executado em cada elemento da matriz e o modifica no local (já que$_
é apenas um alias para os elementos da matriz), primeiro comtr
(revertendo e) atribuindo. Tudo o que também pode ser escrito comoO
r
modificadortr
retorna a string alterada, que é entãoreverse
-ed e atribuída de volta ao elemento da matriz atualmente processado, por meio do$_
alias para elaAqui está uma maneira de fazer isso em Python:
Saída:
No TXR Lisp, usando a
awk
macro:Se você quiser experimentar o Bipython (eu recomendo fortemente quando você trabalha com sequências de ácidos nucléicos), aqui está uma maneira de fazer isso: