Разделить текстовый файл в случайных половинах по категории

У меня есть текстовый файл, который выглядит так:

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 случайных категорий.

Если вы не возражаете против разделения файла на основе категории и работы с кусками, вы можете сделать следующее:

 split -l 500 -a 3 infile rnd=( $(printf %s\\nx??? | shuf -n 100) ) cat "${rnd[@]}" > rand1 rm "${rnd[@]}" cat x??? > rand2 rm x??? 

Это split файл на 200 штук по 500 строк каждый (так что одна часть на каждую категорию) и выбирает 100 случайных фрагментов через shuf – имена файлов сохраняются в массиве – rnd . Затем он объединяет фрагменты, перечисленные в массиве, в rand1 , удаляет их и объединяет оставшиеся части в rand2 и удаляет их тоже. Это решение предполагает, что строки в вашем файле сгруппированы по категориям и что только имена файлов соответствуют x??? в текущем каталоге – те, которые производятся командой split .