Era tão tentador apenas responder "sim" à pergunta "é possível ...".
Será que algo assim faria?
awk '{l=substr($3,1,$4-1); r=substr($3,$4+1); print $0"\t"l $6 r}' genome > mutated
Estou tentando configurar um script que converterá uma sequência de códon em outra sequência de códon, dependendo das variantes que encontrar em meus dados NGS.
Atualmente, o My script cria um arquivo de saída delimitado por tabulação, com 6 colunas. Cada coluna representa o seguinte:
Os dados de saída são assim:
2289 G GTG 3 0.0346505 A
2478 G ATG 2 0.0054087 C
É possível configurar uma sétima coluna no arquivo de saída, que altera a seqüência de nucleotídeos do códon, dependendo do número na coluna 4, para o nucleotídeo do SNP (coluna 6)?
Por exemplo,
O códon GTG se tornaria GTA. O nucleotídeo A do SNP substitui a 3ª seqüência nucleotídica no códon, a ordem da seqüência do códon é especificada na coluna 4.
O codon ATG se tornaria ACG. O nucleotídeo C de SNP substitui a segunda seqüência de nucleotídeos no códon.
É possível usar awk
ou sed
para fazer isso?
Cuidando das posições permitidas na string:
awk -F"\t" '{printf $0 "\t"; if ($4 > 1) { printf substr($3, 1, $4 - 1) }; printf $6; if ($4 < length($3)) { printf substr($3, $4 + 1) }; printf "\n"}'
Ou talvez um pouco mais compreensível:
awk -F"\t" 'BEGIN { OFS = FS } { if ($4 > 1) { mod = substr($3, 1, $4 - 1) }; mod = mod $6; if ($4 < length($3)) { mod = mod substr($3, $4 + 1) }; print $0, mod }'
E como substr
não parece se importar tanto com limites:
awk -F"\t" 'BEGIN { OFS = FS } { mod = substr($3, 1, $4 - 1) $6 substr($3, $4 + 1); print $0, mod }'
Com alguns perl
dividindo e juntando:
perl -alne '
@c = split //, $F[2];
splice @c, $F[3]-1, 1, $F[5];
print join "\t", @F, join "", @c;
' data
Explicação:
- split 3rd column into character array @c
- replace the value indexed by the 4th column with that of the 6th
- stitch it all back together, delimited by tabs
Teste - dado
$ cat data
2289 G GTG 3 0.0346505 A
2478 G ATG 2 0.0054087 C
então
$ perl -alne '
@c = split //,$F[2]; splice @c,$F[3]-1,1,$F[5]; print join "\t",@F,join "",@c
' data
2289 G GTG 3 0.0346505 A GTA
2478 G ATG 2 0.0054087 C ACG
perl -plane 'substr($F[2],$F[3]-1,1)=$F[5]; $_.="\t$F[2]"' data
substr($F[2],$F[3]-1,1)=$F[5]
$_.="\t$F[2]"