当前位置:  开发笔记 > 编程语言 > 正文

在Unix命令行中从文件中读取随机行的简单方法是什么?

如何解决《在Unix命令行中从文件中读取随机行的简单方法是什么?》经验,为你挑选了6个好方法。

在Unix命令行中从文件中读取随机行的简单方法是什么?



1> 小智..:

你可以使用shuf:

shuf -n 1 $FILE

还有一个叫做的工具rl.在Debian中,它在randomize-lines包中完全符合您的要求,但并非在所有发行版中都可用.在它的主页上,它实际上建议使用shuf替代(我相信它在创建时不存在). shuf是GNU coreutils的一部分,rl不是.

rl -c 1 $FILE


你可以通过从Homebrew安装`coreutils`来获得OS X上的shuf.可能被称为`gshuf`而不是`shuf`.
而且,如果处理相当大的文件 - 80kk行,那么`sort -R`绝对会让人等待很多**,而`shuf -n`会立即行动起来.
感谢`shuf`提示,它内置在Fedora中.
同样,你可以通过`brew install randomize-lines在OS X上使用`randomize-lines`; rl -c 1 $ FILE`

2> PolyThinker..:

另一种选择:

head -$((${RANDOM} % `wc -l < file` + 1)) file | tail -1


$ {RANDOM}仅生成小于32768的数字,因此不要将其用于大文件(例如英语词典).
您可以使用`($ {RANDOM} << 15)+ $ {RANDOM}`将其扩展为30位随机数.这大大减少了偏差,并允许它适用于包含多达10亿行的文件.
由于模运算,这并不能为每条线提供精确相同的概率.如果文件长度为<< 32768(如果它除了那个数字则完全没有),这几乎不重要,但可能值得注意.

3> Thomas Vande..:
sort --random-sort $FILE | head -n 1

(我喜欢上面的shuf方法甚至更好 - 我甚至不知道存在,我自己也没有找到这个工具)


+1我喜欢它,但你可能需要一个非常新的`sort`,不适用于我的任何系统(CentOS 5.5,Mac OS 10.7.2).此外,无用的cat,可以简化为`sort --random-sort <$ FILE | 头-n 1`
这是相对较慢的,因为整个文件需要在将它排到"head"之前通过`sort`进行洗牌.`shuf`选择文件中的随机行,而对我来说要快得多.
`--random-sort`和`-R`选项特定于GNU排序(因此它们不适用于BSD或Mac OS`sort`).GNU排序在2005年学习了那些标志,因此你需要GNU coreutils 6.0或更新版本(例如CentOS 6).

4> Yokai..:

这很简单.

cat file.txt | shuf -n 1

当然,这比它自己的"shuf -n 1 file.txt"要慢一点.


最佳答案。我不知道这个命令。请注意,-n 1指定1行,您可以将其更改为1行以上。Shuf也可以用于其他用途。我只是用管道输送了“ ps aux”和“ grep”,以随机杀死部分匹配名称的进程。

5> Tracker1..:

perlfaq5:如何从文件中选择随机行?以下是Camel Book中的油藏采样算法:

perl -e 'srand; rand($.) < 1 && ($line = $_) while <>; print $line;' file

这在读取整个文件的空间方面具有显着的优势.您可以在Donald E. Knuth的"计算机编程艺术"第2卷第3.4.2节中找到这种方法的证明.


这是猫的无用用途.这是对perlfaq5中的代码的略微修改(以及骆驼书的礼貌):perl -e's srand; rand($.)<1 &&($ line = $ _)而<>; 打印$ line;' 文件名
更值得深思:[`shuf`将整个输入文件存储在内存中](/sf/ask/17360801/#comment40771587_9245733) ,这是一个可怕的想法,而这段代码只存储一行,所以这段代码的限制是INT_MAX的行数(2 ^ 31或2 ^ 63,具体取决于你的拱门),假设任何选定的潜在行适合记忆.

6> Paolo Tedesc..:

使用bash脚本:

#!/bin/bash
# replace with file to read
FILE=tmp.txt
# count number of lines
NUM=$(wc - l < ${FILE})
# generate random number in range 0-NUM
let X=${RANDOM} % ${NUM} + 1
# extract X-th line
sed -n ${X}p ${FILE}

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有