bashshell中用awk生成随机数

bashshell中用awk生成随机数,awk,Awk,我希望随机洗牌一个文件的行,然后打印成不同的五个文件 但我一直保持在文件1到文件5中出现的行的顺序完全相同。随机生成过程无法正常工作。如有任何建议,我将不胜感激 #!/bin/bash for i in seq 1 5 do awk 'BEGIN{srand();} {print rand()"\t"$0}' shuffling.txt | sort -k2 -k1 -n | cut -f2- > file$i.txt done 输入shuffling.txt 111 1032

我希望随机洗牌一个文件的行,然后打印成不同的五个文件

但我一直保持在文件1到文件5中出现的行的顺序完全相同。随机生成过程无法正常工作。如有任何建议,我将不胜感激

#!/bin/bash
for i in seq 1 5
do
  awk 'BEGIN{srand();}  {print rand()"\t"$0}' shuffling.txt  | sort -k2 -k1 -n | cut -f2-  > file$i.txt
done
输入shuffling.txt

111 1032192
111 2323476
111 1698881
111 2451712
111 2013780
111  888105
112 2331004
112 1886376
112 1189765
112 1877267
112 1772972
112  574631

如果未向
srand
提供种子,它将使用当前日期和时间或固定的起始种子(这可能因实现而异)。这意味着,对于前者,如果进程运行得足够快,它们都将使用相同的种子并生成相同的序列

对于后者,无论您等待多长时间,每次运行时都会得到相同的序列

您可以通过使用外壳提供的不同种子来绕过这两个问题

awk -v seed=$RANDOM 'BEGIN{srand(seed);}{print rand()" "$0}' ...
$RANDOM
提供的数字在每次迭代中都会发生变化,因此
awk
程序的每次运行都会获得不同的种子

你可以在下面的文字记录中看到这一点:

pax> for i in $(seq 1 5) ; do
...> awk 'BEGIN{srand();print rand()}'
...> done
0.0435039
0.0435039
0.0435039
0.0435039
0.0435039

pax> for i in $(seq 1 5) ; do
...> awk -v seed=$RANDOM 'BEGIN{srand(seed);print rand()}'
...> done
0.283898
0.0895895
0.841535
0.249817
0.398753

Awk的伪随机性不是很随机,您需要继续播种,您应该能够在大多数情况下使用微秒,否则您可能需要查看
Bash${random}
或点击
/dev/uradom
直接:

awk'BEGIN{“date+%N”| getline rseed;srand(rseed);close(“date+%N”);print rand()}


for((i=1;在BEGIN块外添加了类似的内容:
awk'{r| getline s;close(r);srand(s);printf(“sleep%s;%s\n”,rand(),$0)}'r=“echo\$RANDOM”
-只需在每行(命令)之前插入随机睡眠>1秒即可)来自输入文件。本注释中简化了用例,但它以awk为中心,并希望在awk中进行所有处理。对于“随机读取器”-NB!记住对每个循环
close()
#!/bin/bash
for i in {1..5}
do
    shuf -o "file$i.txt" shuffling.txt
done
for((i=1;i<=5;i++));do awk 'BEGIN{"date +%N"|getline rseed;srand(rseed);close("date +%N");print rand()}';done