如何高效地对文件行进行随机排序(洗牌)?

3

sort 带有 --random-sort 选项,但这个选项会显著降低 sort 的速度:

# time sort --random-sort input >/dev/null

real    0m7.247s
user    0m7.232s
sys     0m0.004s

没有使用--random-sort,速度会快10倍:
input未经过排序)

# time sort input >/dev/null

real    0m0.625s
user    0m0.616s
sys     0m0.008s

为什么速度如此缓慢?有没有一种有效的方法来高效地洗牌文件的行?


2个回答

4
您可以尝试使用 shuf。由于它专门用于此项工作,因此应该更快。

我应该补充说明一下,shuf会将整个输入文件加载到内存中,因此并不总是适用的。 - Arnaud Le Blanc
@arnaud576875:我认为如果不对文件进行多次遍历,这是无法避免的。 - Peter Alexander

0

或者你可以尝试使用awk在文件中选择随机行,以下是一个示例(我没有测试性能):

awk '{a[NR]=$0} 
     END{
         srand(); 
         for(j=0; j<100; j++) {
             i=int(rand()*NR+1);
             print a[i];
         }
     }'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接