【发布时间】:2014-02-13 12:42:05
【问题描述】:
我想随机输出文件总行数的 10%。例如,文件 a 有 1,000,000 行,然后我想从文件中随机输出 100,000 行(100,000 是 1,000,000 的 10%)。
假设文件很小,这很容易做到:
randomLine=`wc -l a | awk '{printf("%d\n",($1/10))}'`
sort -R a | head -n $randomLine
但是使用 sort -R 非常慢。它将执行专门的随机计算。我的文件有 10,000,000 行。排序需要太多时间。有没有办法归档一个不那么专门、不那么随机但有效的采样?
编辑想法:
- 每十行采样一行是可以接受的。但我不知道如何使用 shell 脚本来做到这一点。
-
逐行读取,如果
echo $RANDOM%100 | bc
大于 20 则输出该行(使用大于 10 的数字确保得到不少于 10% 的行),一旦输出 10% 行就停止。但我不知道如何使用 shell 脚本逐行读取。
编辑说明
我想使用 shell 脚本的原因是我的文件包含 \r 字符。文件中的换行符应该是 \n 但是 Python 和 Java 中的 readline() 函数将 \r 和 \n 视为换行符,这不符合我的需要。
【问题讨论】:
-
1000 不是 1,000,000 的 10% :|
-
是否足够随机以从每 10 行中随机打印一行?
-
如果您正在寻找总体思路;看看水库采样。 (不知道如何将其改编为 shell 脚本)。
-
谢谢。 1,000,000 的 10% 是 100,000!
-
这不应该在 shell 中完成。如果您坚持,请逐行阅读,每次都会得到一个(均匀)分布的随机数。选择一个阈值,使 90% 的随机数低于该阈值(可能是某个模数 m)。仅当随机数超过阈值时才打印每一行。 (如果您需要恰好 10%,请在 [1...行数] 上进行分配,其中 90% 的行低于阈值...您不想在 shell 中这样做)
标签: linux algorithm bash sorting random