我正在尝试使用awk
和rand()
对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}'
为什么?
答案 0 :(得分:4)
注意:在大多数awk实现中,包括gawk,rand()每次运行awk时都会从相同的起始编号或种子开始生成数字。因此,程序每次运行时都会生成相同的结果。这些数字在一个awk运行中是随机的,但是从运行到运行是可预测的。这对于调试很方便,但如果您希望程序在每次使用时都执行不同的操作,则必须将种子更改为每次运行时不同的值。为此,请使用srand()。
答案 1 :(得分:0)
因此,要应用手册页中指出的内容并在该论坛和Internet上的其他地方重复使用,我想使用:
awk -v rseed=$RANDOM 'BEGIN{srand(rseed);}{print rand()" "$0}'
rseed 变量是可选的,但包含在此处,因为有时当其他变量可以更改时,它可以帮助我具有确定性/可重复的随机序列用于仿真。