加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

从bash中的大文件中获取随机行

发布时间:2020-12-16 01:48:47 所属栏目:安全 来源:网络整理
导读:如何从非常大的文件中获取n个随机行,这些文件不适合内存. 如果我可以在随机化之前或之后添加过滤器也会很棒. 更新1 在我的情况下,规格是: 1亿行 10GB文件 通常随机批量大小10000-30000 512RAM托管ubuntu服务器14.10 因此,从文件中丢失几行不会是一个大问题,
如何从非常大的文件中获取n个随机行,这些文件不适合内存.

如果我可以在随机化之前或之后添加过滤器也会很棒.

更新1

在我的情况下,规格是:

>> 1亿行
>> 10GB文件
>通常随机批量大小10000-30000
> 512RAM托管ubuntu服务器14.10

因此,从文件中丢失几行不会是一个大问题,因为它们无论如何都有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行,则会出现故障边缘情况从最开始.解决这个问题留给读者练习.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读