【问题标题】:Choosing random lines with replacement from an XY file从 XY 文件中选择带有替换的随机行
【发布时间】:2020-10-15 13:28:46
【问题描述】:

我有一个 XY 文件,其中包含超过 40000 行唯一的浮点数。我想在这个文件上使用引导重采样。 Bootstrap 重采样的工作原理如下:它重新采样 N 个随机行(N 是输入文件的编号)并从输入文件中替换。这意味着新数据集(输出)与第一个文件具有相同的行数,并且新数据集可以多次包含某些行,并且可能根本不包含某些原始行。我尝试使用

来洗牌
shuf -n N input > output

sort -R input | head -n N > output

,但他们似乎没有实现替换。

如果有人可以介绍一种使用 AWK 和 Shell 的方法,我们将不胜感激。

【问题讨论】:

  • 您想从输入文件中获取N 随机记录,并且输出文件中的计数应该与输入文件相同?
  • 您能否更好地解释您的要求。完全不清楚你想做什么。我理解这一点的方式是您想从文件中提取 n 行(Q1 这些行可以包含重复吗?),将它们打乱,然后将这些 n 行替换为新订单。 (Q2这怎么可能有重复?)
  • @DigvijayS 输出行数应该和第一个文件一样。
  • @kvantour 输出的行数应该与输入相似。 Bootstrap 随机抽样并从输入文件中替换。因此,对于每次绘制,输入文件的所有行(甚至是先前为输出选择的行)都有相同的可能性被选择。换句话说,每次选择每一行时,我们都是从原始输入文件中随机选择的。输出可以有来自输入的重复行,也可以没有来自输入的任何行。我希望这可以澄清一点。

标签: bash shell random awk text-processing


【解决方案1】:

我相信你所追求的是:

假设您有一个输入文件input,其内容如下:

$ seq 10 > input

然后你可以得到一个新的随机文件,它具有相同的行和可能的重复,如下所示:

$ shuf -rn $(wc -l input) input
7
2
9
3
1
7
4
8
7
10

这里我们使用-r 标志来允许重复。

【讨论】:

  • 非常感谢。这很好用。它将 44000 行唯一数据更改为大约 28000 行唯一数据。我只是好奇有没有办法控制输出中重复行的数量?
  • 如果您想要最多 n 次重复,则必须以不同的方式进行:awk -v n=10 '{for(i=1;i<=10;++i) print}' input | shuf -n $(wc -l input)。您所做的是最多打印每一行 n 次,然后在其中不重复地 shuf。
猜你喜欢
  • 2011-11-22
  • 1970-01-01
  • 2012-03-03
  • 1970-01-01
  • 2016-09-22
  • 1970-01-01
  • 1970-01-01
  • 2012-09-03
相关资源
最近更新 更多