Multiplicando números no arquivo por números aleatórios

0

Eu tenho um arquivo contendo linhas como:

tree my_tree = ((t1:961.00,t2:902.00):961:00,t3:878:00);

que representa uma estrutura de árvore com comprimentos de ramificação. Eu quero multiplicar todos os comprimentos de ramificação em cada linha, ou seja, números após : , por (de preferência único) números aleatórios entre 0 e 1. Também seria ótimo se existe algum utilitário gerador de número aleatório em que a distribuição pode ser especificada , diga normal com média e desvio padrão.

Eu sei como gerar números aleatórios com, digamos, $RANDOM ou shuf dentro de um intervalo específico > 1. Eu também sei como substituir um regex com sed no arquivo sed -i 's/:[0-9\.]+/My_RANDOM_NUMBER/g' my_file . Mas ainda estou lutando para conseguir a tarefa.

Obrigado!

    
por havij 27.07.2016 / 23:32

1 resposta

3

Eu usaria algo como perl ou awk , que pode manipular operações aritméticas, em vez de sed (que só pode realmente substituir a expressão regular).

Por exemplo, usando perl

$ printf 'tree my_tree = ((t1:961.00,t2:902.00):961:00,t3:878:00);\n' | 
    perl -pe 's/:([0-9.]+)/sprintf ":%.2f", $1*rand()/ge'
tree my_tree = ((t1:918.95,t2:880.40):633.34:0.00,t3:648.35:0.00);

Você pode substituir rand() do perl por outra função de biblioteca aleatória de sua escolha - por exemplo, usando Math::Random do pacote libmath-random-perl :

$ printf 'tree my_tree = ((t1:961.00,t2:902.00):961:00,t3:878:00);\n' | 
  perl -MMath::Random=random_normal -pe 's/:([0-9.]+)/sprintf ":%.2f", $1*random_normal(0.0, 1.0)/ge'
tree my_tree = ((t1:-362.08,t2:822.35):-254.87:0.00,t3:1158.46:0.00);
    
por steeldriver 28.07.2016 / 00:30