我有一个文件,其中包含如下行:
tree my_tree = ((t1:961.00,t2:902.00):961:00,t3:878:00);
它表示具有分支长度的树结构。我想将每行中的所有分支长度(即后面的数字):
乘以 0 到 1 之间的(最好是唯一的)随机数。此外,如果有任何随机数生成器实用程序可以指定分布,比如给定平均值和标准差的正态分布,那就太好了。
我知道如何生成特定范围 >1 内的随机数。我还知道如何在文件中用 sed 替换正则表达式$RANDOM
。但我仍在努力完成任务。shuf
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);