从bash中的大文件中获取随机行
发布时间:2020-12-16 01:48:47 所属栏目:安全 来源:网络整理
导读:如何从非常大的文件中获取n个随机行,这些文件不适合内存. 如果我可以在随机化之前或之后添加过滤器也会很棒. 更新1 在我的情况下,规格是: 1亿行 10GB文件 通常随机批量大小10000-30000 512RAM托管ubuntu服务器14.10 因此,从文件中丢失几行不会是一个大问题,
如何从非常大的文件中获取n个随机行,这些文件不适合内存.
如果我可以在随机化之前或之后添加过滤器也会很棒. 更新1 在我的情况下,规格是: >> 1亿行 因此,从文件中丢失几行不会是一个大问题,因为它们无论如何都有1万分之一的机会,但性能和资源消耗会成为问题 解决方法
这是一个小小的bash函数.正如你所说,它抓住了一批“批处理”的行,在文件中有一个随机起点.
randline() { local lines c r _ # cache the number of lines in this file in a symlink in the temp dir lines="/tmp/${1////-}.lines" if [ -h "$lines" ] && [ "$lines" -nt "${1}" ]; then c=$(ls -l "$lines" | sed 's/.* //') else read c _ < <(wc -l $1) ln -sfn "$c" "$lines" fi # Pick a random number... r=$[ $c * ($RANDOM * 32768 + $RANDOM) / (32768 * 32768) ] echo "start=$r" >&2 # And start displaying $2 lines before that number. head -n $r "$1" | tail -n ${2:-1} } 根据需要编辑回波线. 这种解决方案的优点是管道更少,资源密集程度更低(即没有| |),平台依赖性更小(即没有排序-R,这是GNU排序特定的). 请注意,这依赖于Bash的$RANDOM变量,该变量实际上可能是也可能不是随机变量.此外,如果您的源文件包含超过32768 ^ 2行,它将丢失行,如果您指定的行数(N)> 1且随机起始点小于N行,则会出现故障边缘情况从最开始.解决这个问题留给读者练习. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 10、bash脚本编程之程序语句选择执行、循环执行
- bootstrap.min.css和bootstrap.css有什么区别?
- AngularJS系列之select下拉选择第一个选项为空白的解决办法
- JS组件Bootstrap实现下拉菜单效果代码
- Webservice凭据 – OpenID/Android AccountManager?
- angularjs – 元素中的Angular ng-repeat条件包装项(ng-rep
- Scala中的广义结构类型一致性
- 如何为angularJS $cookies设置域名
- scala – monad变压器是否适用于从服务中获取JSON?
- shell curl 与 python requests的一次对比