rand()如何在awk中运行

时间:2017-08-27 01:44:47

标签: shell awk

我正在尝试使用awkrand()对csv文件的第二列进行采样(任意数量的样本都可以)。但是,我注意到我总是得到相同数量的样本

cat toy.txt | awk -F',' 'rand()<0.2 {print $2}' | wc -l

我进行了探索,似乎rand()没有像我预期的那样工作。例如,下面的a似乎总是1,

cat toy.txt | awk -F',' 'a=rand() a<0.2 {print a}' 

为什么?

2 个答案:

答案 0 :(得分:4)

来自documentation

  

注意:在大多数awk实现中,包括gawk,rand()每次运行awk时都会从相同的起始编号或种子开始生成数字。因此,程序每次运行时都会生成相同的结果。这些数字在一个awk运行中是随机的,但是从运行到运行是可预测的。这对于调试很方便,但如果您希望程序在每次使用时都执行不同的操作,则必须将种子更改为每次运行时不同的值。为此,请使用srand()。

答案 1 :(得分:0)

因此,要应用手册页中指出的内容并在该论坛和Internet上的其他地方重复使用,我想使用:

awk -v rseed=$RANDOM 'BEGIN{srand(rseed);}{print rand()" "$0}'

rseed 变量是可选的,但包含在此处,因为有时当其他变量可以更改时,它可以帮助我具有确定性/可重复的随机序列用于仿真。