我有一个如下所示的文本文件:
n03250847/n03250847_0.JPEG n03250847
n03250847/n03250847_1.JPEG n03250847
...
n03250847/n03250847_499.JPEG n03250847
...
n03255030/n03255030_0.JPEG n03255030
n03255030/n03255030_1.JPEG n03255030
...
n03255030/n03255030_499.JPEG n03255030
空格后的最后一个数字是类别号。我有 200 个不同的类别,每个类别有 500 行(0 到 499)。我想将此文件分成两部分,其中每个结果文件包含 100 个随机类别。
答案1
如果您不介意根据类别拆分文件并处理各个部分,您可以这样做:
split -l 500 -a 3 infile
rnd=( $(printf %s\\n x??? | shuf -n 100) )
cat "${rnd[@]}" > rand1
rm "${rnd[@]}"
cat x??? > rand2
rm x???
这split
会将文件分成 200 个片段,每个片段 500 行(因此每个类别一个片段),并通过shuf
- 文件名保存在数组中 -随机选择 100 个片段rnd
。然后它将数组中列出的片段合并到 中rand1
,删除它们,并将剩余的片段合并到 中rand2
并删除它们。此解决方案假定文件中的行按类别分组,并且x???
当前目录中唯一匹配的文件名是split
命令生成的文件名。