根据类别将文本文件随机分成两半

根据类别将文本文件随机分成两半

我有一个如下所示的文本文件:

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命令生成的文件名。

相关内容