在shell脚本中从文件中读取随机行有什么简单的方法?
当前回答
一个解决方案,也适用于MacOSX,应该也适用于Linux(?):
N=5
awk 'NR==FNR {lineN[$1]; next}(FNR in lineN)' <(jot -r $N 1 $(wc -l < $file)) $file
地点:
N是你想要的随机行数 NR = = FNR{亚麻(1美元);next}(亚麻中的FNR) file1 file2 ——>保存file1中写入的行号,然后打印file2中相应的行 jot -r $N 1 $(wc -l < $file)——>在(1,number_of_line_in_file)范围内随机抽取N个数字(-r)。进程替换<()将使它看起来像解释器的文件,即前面示例中的file1。
其他回答
sort --random-sort $FILE | head -n 1
(我更喜欢上面的shiff方法——我甚至不知道它的存在,我自己也永远不会找到这个工具)
一个解决方案,也适用于MacOSX,应该也适用于Linux(?):
N=5
awk 'NR==FNR {lineN[$1]; next}(FNR in lineN)' <(jot -r $N 1 $(wc -l < $file)) $file
地点:
N是你想要的随机行数 NR = = FNR{亚麻(1美元);next}(亚麻中的FNR) file1 file2 ——>保存file1中写入的行号,然后打印file2中相应的行 jot -r $N 1 $(wc -l < $file)——>在(1,number_of_line_in_file)范围内随机抽取N个数字(-r)。进程替换<()将使它看起来像解释器的文件,即前面示例中的file1。
perlfaq5:我如何从文件中选择一个随机的行?下面是Camel Book上的一个油藏采样算法:
perl -e 'srand; rand($.) < 1 && ($line = $_) while <>; print $line;' file
与读取整个文件相比,这在空间上有很大的优势。你可以在Donald E. Knuth的《计算机编程艺术》第2卷第3.4.2节中找到这种方法的证明。
只使用普通sed和awk,不使用$RANDOM,一个简单、节省空间和合理快速的“一行程序”可以从文件名FILENAME中伪随机地选择一行,如下所示:
sed -n $(awk 'END {srand(); r=rand()*NR; if (r<NR) {sub(/\..*/,"",r); r++;}; print r}' FILENAME)p FILENAME
(即使FILENAME为空也能工作,在这种情况下不会触发任何行。)
这种方法的一个可能的优点是它只调用rand()一次。
正如@AdamKatz在评论中指出的,另一种可能是为每一行调用rand():
awk 'rand() * NR < 1 { line = $0 } END { print line }' FILENAME
(基于归纳法可以给出简单的正确性证明。)
关于rand的警告()
在大多数awk实现中,包括gawk, rand()每次运行awk时都从相同的起始数字或种子开始生成数字。
——https://www.gnu.org/software/gawk/manual/html_node/Numeric-Functions.html
以下是我的发现,因为我的Mac OS不使用所有简单的答案。我使用jot命令来生成一个数字,因为$RANDOM变量解决方案在我的测试中似乎不是很随机。当测试我的解决方案时,我在输出中提供的解决方案中有很大的差异。
RANDOM1=`jot -r 1 1 235886`
#range of jot ( 1 235886 ) found from earlier wc -w /usr/share/dict/web2
echo $RANDOM1
head -n $RANDOM1 /usr/share/dict/web2 | tail -n 1
变量的回声是为了得到生成的随机数的视觉效果。
推荐文章
- 如何从枚举中选择一个随机值?
- 删除Bash脚本中的重复条目
- 如何将Bash命令的输出分配给变量?
- PHP中的异步shell执行器
- random.seed():它做什么?
- Git显示“警告:永久添加到已知主机列表”
- Java中生成UUID字符串的有效方法(UUID. randomuuid ().toString()不带破折号)
- 检索Linux上单个进程的CPU使用情况和内存使用情况?
- 如何从远程SSH会话发送数据到本地剪贴板
- 我如何得到bash完成工作与别名?
- 通过使用shell脚本替换文件名中的特定模式来重命名多个文件
- 如何从字典中获得一个随机值?
- 如何杀死僵尸进程
- 如何进入每个目录并执行命令?
- 如何通过脚本创建crontab