Умножение чисел в файле на случайные числа

У меня есть файл, содержащий такие строки, как:

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);
Другие вопросы по тегам