用BASH shell中的awk生成随机数

Ton*_*ony 6 awk

我希望随机地对文件的行(行)进行随机打印,然后打印到不同的五个文件.

但我一直在file1到file5中出现完全相同的行顺序.随机生成过程无法正常工作.我会很感激任何建议.

#!/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
Run Code Online (Sandbox Code Playgroud)

输入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
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 18

如果您不提供种子srand,它将使用当前日期和时间.这意味着,如果您的进程运行得足够快,它们将使用相同的种子并生成相同的序列.

你可以通过使用shell提供的不同种子来解决这个问题.

awk -v seed=$RANDOM 'BEGIN{srand(seed);}{print rand()" "$0}' ...
Run Code Online (Sandbox Code Playgroud)

$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
Run Code Online (Sandbox Code Playgroud)