Altera um caractere em uma coluna dependendo de uma instrução de outra coluna

2

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:

  • 1º: posição do genoma
  • 2º: base de nucleotídeos
  • 3º: Codon
  • 4º: ordem de posição do genoma no códon
  • 5º: frequência do SNP
  • 6: Base SNP

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,

  • Para a posição do genoma 2289:

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.

  • Para o genoma Posição 2478

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?

    
por David King 01.01.2018 / 20:13

5 respostas

1

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
    
por 01.01.2018 / 20:52
1

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 }'
    
por 01.01.2018 / 20:55
1

Solução de Perl:

perl -lane 'substr $n = $F[2], $F[3] - 1, 1, $F[5]; print join "\t", $_, $n' -- file
  • -n lê a linha de entrada por linha
  • -l remove as novas linhas da entrada e as adiciona a impressão s
  • -a divide cada linha no espaço em branco no array @F
  • veja substr para detalhes
por 01.01.2018 / 23:28
1

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
    
por 01.01.2018 / 23:51
0
perl -plane 'substr($F[2],$F[3]-1,1)=$F[5]; $_.="\t$F[2]"' data
  • altere F2 de acordo com a pergunta substr($F[2],$F[3]-1,1)=$F[5]
  • e concatenar na linha de entrada $_.="\t$F[2]"
por 02.01.2018 / 11:36