Bash 用固定种子洗牌文件的行?

Bash 用固定种子洗牌文件的行?,bash,sorting,Bash,Sorting,我想用一个固定的种子洗牌文件的行,这样我总是得到相同的随机顺序。我使用的命令如下: sort -R file.txt | head -200 > file.sff 我可以对它进行什么更改,以便它使用固定的随机种子进行排序?如果您随机洗牌行,则不进行排序。我以前没有看到带有--random source提示的排序。如果它真的存在,那会很有趣。但是,这并不是按固定顺序对行进行排序 我相信您必须为此编写一个程序,而我认为Bash无法做到这一点 事实上,可能是这样。$RANDOM环境变量选择0到

我想用一个固定的种子洗牌文件的行,这样我总是得到相同的随机顺序。我使用的命令如下:

sort -R file.txt | head -200 > file.sff

我可以对它进行什么更改,以便它使用固定的随机种子进行排序?

如果您随机洗牌行,则不进行排序。我以前没有看到带有
--random source
提示的
排序
。如果它真的存在,那会很有趣。但是,这并不是按固定顺序对行进行排序

我相信您必须为此编写一个程序,而我认为Bash无法做到这一点

事实上,可能是这样。$RANDOM环境变量选择0到32767之间的随机数。您可以将种子分配给
RANDOM
,随机数序列将反复出现。你可以用一个。将每一行读入Bash数组,然后使用卡片处理算法拾取每一行


我不打算编写测试程序——特别是在Bash中,但您应该明白。

排序的GNU实现有一个
--随机源
参数。使用具有已知内容的文件名传递此参数将产生一组可靠的输出

请参阅GNU coreutils手册中的文档,其中包含以下示例实现和示例:


您可能不需要使用诸如
排序
之类的外部工具,这些工具的选项和用法可能因您的操作系统而异。Bash有一个内部随机数生成器,可通过
$random
变量访问。通常的做法是通过设置变量为生成器设定种子,如下所示:

RANDOM=$$

等等。当然,您也可以使用可预测的种子,以获得可预测而非随机的结果:

$ RANDOM=12345; echo $RANDOM
28207
$ RANDOM=12345; echo $RANDOM
28207
要随机重新排列映射文件的行,可以使用mapfile将文件读入数组:

$ mapfile -t a < source.txt
在读取非关联数组时,bash自然会按索引值的升序对元素排序

请注意,每行的新索引都添加了数组元素的数量,以避免在该范围内发生冲突。这个解决方案仍然容易出错——不能保证
$RANDOM
会产生唯一的数字。您可以使用额外的代码来检查每个索引的先前使用情况,或者使用位移位来降低风险:

... a[$(( (RANDOM<<15)+RANDOM+${#a[@]} ))]= ...

。。。a[$(((Randomon不
——RandomSource
有效吗?我自己刚刚找到了这个问题的答案,但是是的——RandomSource roe,恭喜你。答案在这个链接中:由于
排序
舒夫
都是GNU coreutils的一部分,这有一点关系吗?如果有一个,他们两个都有。如果在macOS上使用自制,)e> shuf
gshuf
(coreutils
包的一部分)。
--随机源代码
是一个很好的开始,但请注意,它需要更多的字节;否则会抛出一个
文件结尾
错误;请参阅
$ RANDOM=12345; echo $RANDOM
28207
$ RANDOM=12345; echo $RANDOM
28207
$ mapfile -t a < source.txt
$ for i in ${!a[@]}; do a[$((RANDOM+${#a[@]}))]="${a[$i]}"; unset a[$i]; done
... a[$(( (RANDOM<<15)+RANDOM+${#a[@]} ))]= ...