【问题标题】:Random numbers generation with awk in BASH shell在 BASH shell 中使用 awk 生成随机数
【发布时间】:2011-05-02 04:38:56
【问题描述】:

我希望随机打乱文件的行(行),然后打印到不同的五个文件。

但我一直在 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

输入 shuffle.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

【问题讨论】:

    标签: awk


    【解决方案1】:

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

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

    您可以通过使用由 shell 提供的不同种子来解决其中任何一个问题。

    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
    

    【讨论】:

      【解决方案2】:
      #!/bin/bash
      for i in {1..5}
      do
          shuf -o "file$i.txt" shuffling.txt
      done
      

      【讨论】:

        【解决方案3】:

        awk 的伪随机不是很随机,需要不断播种,大多数情况下应该可以使用微秒,否则你可能要查看Bash ${RANDOM} 或直接点击/dev/urandom

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

        for((i=1;i<=5;i++));do awk 'BEGIN{"date +%N"|getline rseed;srand(rseed);close("date +%N");print rand()}';done
        

        【讨论】:

        • 在 BEGIN 块之外得到了类似的东西:awk '{ r | getline s ; close(r) ; srand(s) ; printf("sleep %s ; %s\n", rand(), $0) }' r="echo \$RANDOM" &lt;input&gt; - 只需在输入文件的每一行(命令)之前插入随机睡眠 > 1 秒。此评论中简化了用例,但它以 awk 为中心,并希望在 awk 中进行所有处理。对于“随机读者” - 注意!每个循环记得close()
        猜你喜欢
        • 2020-12-18
        • 2010-11-14
        • 2023-03-13
        • 2011-11-30
        • 1970-01-01
        • 1970-01-01
        • 2017-05-02
        • 1970-01-01
        • 2012-02-17
        相关资源
        最近更新 更多