Умножение чисел в файле на случайные числа
У меня есть файл, содержащий такие строки, как:
tree my_tree = ((t1:961.00,t2:902.00):961:00,t3:878:00);
которая представляет собой древовидную структуру с длинами ветвей. Я хочу умножить все длины веток в каждой строке, то есть числа после:
, (желательно уникальными) случайными числами от 0 до 1. Также было бы здорово, если бы существовала какая-либо утилита для генерации случайных чисел, в которой можно указать распределение, скажем, нормальное с данным средним и стандартным отклонением.
Я знаю, как генерировать случайные числа, скажем, $RANDOM
или же shuf
в пределах определенного диапазона>1. Я также знаю, как заменить регулярное выражение с sed в файле sed -i 's/:[0-9\.]+/My_RANDOM_NUMBER/g' my_file
, Но я все еще изо всех сил пытаюсь достичь цели.
Спасибо!
1 ответ
Я бы использовал что-то вроде perl
или же awk
которые могут обрабатывать арифметические операции, а не sed
(который может действительно только заменить регулярное выражение).
Например, используя 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);
Вы можете заменить Perl rand()
другой случайной библиотечной функцией по вашему выбору - например, используя Math::Random
от 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);