我有一个格式如下的文件:
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