根据模式提取N行的随机样本

根据模式提取N行的随机样本

我有一个格式如下的文件:

train/t/temple/east_asia/00000025.jpg 94
train/t/temple/east_asia/00000865.jpg 94
...
train/s/swamp/00000560.jpg 92
train/s/swamp/00000935.jpg 92
....
train/m/mountain/00000428.jpg 68
train/m/mountain/00000126.jpg 68

最后一个数字是班级编号。我有 50 个不同的类,每个类有 1,000 行。我想从每个类中随机抽取大小为 N 的样本,并将结果存储在另一个文本文件中。

答案1

由于您的行是按类分组的,因此您可以(使用gnu工具)split将文件分成几部分,并使用--fiter选项通过管道将每个部分shuf提取出来其中的随机行:

分割--filter='shuf -n' 内文件 > 外文件

请注意,split默认为 1000 行 - 这是您在这种特殊情况下所需要的。如果需求发生变化,您必须通过eg传递行数,-l
将其分成200行,并从每行中提取30条随机行:

split -l 200 --filter='shuf -n 30' infile > outfile

答案2

awk您应该只需调用一次命令即可做到这一点:

从每 n=1000 行中随机选择 p=50 行:

awk -v n=1000 -v p=50 '
  BEGIN {srand(); remaining = p}
  NR > n {remaining = p; NR = 1}
  rand()*(n + 1 - NR) < remaining {
    print; remaining--
  }' < your-file

相关内容