【问题标题】:Get random text block from file using bash使用 bash 从文件中获取随机文本块
【发布时间】:2015-05-12 23:32:34
【问题描述】:

使用 bash 从文本文件中读取随机字符块的最简单方法是什么?

块是一组以X开头并以X结尾的字符,其中X是一个字符序列,通常是"\n\n"

我们可以假设文件有短行,每行少于 200 个字符。 块不超过 20 行。

我见过像get random line、get text from between two tokens 这样的线程,但这并不是我所需要的。

我可以用 C 编写一个简单的程序,它将读取文件中有多少块,从给定范围中获取一个随机数,然后搜索具有此 ID 的块,但必须有更简单的方法。

示例: X = "\n\n"

文件:(. 不在文件中,我用它们在代码的开头和结尾制作“空”行)

.
first line
second line and some other text

fourth line

sixth line
seventh line, more textęęę
.

第一次运行脚本,输出:

fourth line

第二次运行脚本,输出:

first line
second line and some other text

您忠实的, 用户2420535

【问题讨论】:

  • 你能展示一个输入文件的样本和你的预期输出吗?

标签: bash random token


【解决方案1】:

要一次性从一个以空行分隔的块文件中获取一个均匀随机的块,

awk -v RS='\n\n'  '
  BEGIN { srand(); } 
  rand() < 1.0/NR { s=$0; }  
  END { print s; }
  '   file

这是Reservoir Sampling的简单案例。

【讨论】:

  • 干得好;所以其他人也不会试图错误地优化:算法必须循环遍历所有输入记录。遗憾的是,BSD awk(和 POSIX 规范)不支持多字符。 RS 值;最接近的近似值是将-v RS= 用于段落模式,但是,它允许任何 个空行来分隔块。
猜你喜欢
  • 1970-01-01
  • 2015-05-20
  • 2015-01-06
  • 2017-08-30
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-03
相关资源
最近更新 更多