Altere os números neste formulário: 0.873000 / 0,234000 para este formulário: 87/23

1

De um arquivo como este (árvore filogenética na qual o ramo suporta está entre 0 e 1):

(AJirio:0.00207,(AJama:0.00176,(AJtok:0.00034,AJkago:0.00057)0.832000:0.00080)0.934000:0.00111)0.923000

Eu preciso obter isso (árvore filogenética em que os suportes de ramificação são inteiros entre 0 e 100):

(AJirio:0.00207,(AJama:0.00176,(AJtok:0.00034,AJkago:0.00057)83:0.00080)93:0.00111)92

As diferenças entre os dois estão em negrito. Alguém sabe como fazer isso? Talvez com o awk?

    
por DavidB 30.01.2018 / 13:16

3 respostas

0

Isso é bastante fácil com sed , se todos os dados se parecem com os dados da amostra:

sed -e 's/)0\.0\(.\)[0-9]*/)/g' -e 's/)0\.\(..\)[0-9]*/)/g' -e 's/)1\.00[0-9]*/)100/g' file

Isso tem três% subcomandos-e, que são variações do mesmo tema. Cada um procura por um ) seguido por um número decimal entre 0,00 e 1,00, com pelo menos dois dígitos decimais, e substitui-o por um ) seguido pelo inteiro correspondente entre 0 e 100. Cada um termina com g para torná-lo global por isso afeta qualquer número de suportes de ramificação em cada linha. Infelizmente, isso trunca os números em vez de arredondá-los então 0.838 se torna 83 em vez de 84 .

Detalhes:

  • s/)0\.0\(.\)[0-9]*/)/g
    Procura um número que comece com 0.0 (por exemplo, 0.00 ou 0.07 ) e substitui-o por apenas o segundo dígito decimal, então 0.00 e 0.07 se tornam 0 e 7 em vez de 00 e 07 . [0-9]* corresponde a qualquer número de dígitos após o segundo e descarta-os (substituindo-os por nada).
  • s/)0\.\(..\)[0-9]*/)/g
    Esse é o caso geral: 0. seguido por algo diferente de 0 . Isso muda 0.832000 para 83 , etc.
  • s/)1\.00[0-9]*/)100/g
    Isso procura 1.00 e altera para 100 . Se você tem certeza de que isso nunca aparecerá nos seus dados, você pode deixar este subcomando.

Se, como você sugere no título da pergunta, você também quer poder alterar 0,234000 (com uma vírgula como uma marca decimal) para 23 , altere \. para [,.] em cada um dos subcomandos.

    
por 31.01.2018 / 04:28
2

Use o awk para extrair o conteúdo requerido do arquivo usando o comando abaixo ( temp.txt é o arquivo de entrada):

awk -F ")" '{print $1 ")" substr($2,3,2) substr($2,9) ")" substr($3,3,2) substr($3,9) ")" substr($4,3,2) }' temp.txt
    
por 30.01.2018 / 13:38
0
$ cat test.txt
(AJirio:0.00207,(AJama:0.00176,(AJtok:0.00034,AJkago:0.00057)0.832000:0.00080)0.934000:0.00111)0.923000

$  awk -F\) '{for(i=NF-2;i<=NF;i++){split($i,arr,":");$i=sprintf("%2d:%s",arr[1]*100,arr[2])}}1' OFS=\) test.txt | sed "s/:$//"
(AJirio:0.00207,(AJama:0.00176,(AJtok:0.00034,AJkago:0.00057)83:0.00080)93:0.00111)92
    
por 31.01.2018 / 08:06