Если вы не против разбить файл по категориям и работать с частями, вы можете сделать:
split -l 500 -a 3 infile
rnd=( $(printf %s\\n x??? | shuf -n 100) )
cat "${rnd[@]}" > rand1
rm "${rnd[@]}"
cat x??? > rand2
rm x???
Это разделение
разбивает файл на 200 частей по 500 строк каждая (то есть одна часть на категорию) и выбирает 100 случайных частей через shuf
- имена файлов сохраняются в массиве - rnd
. Затем он объединяет части, перечисленные в массиве, в rand1
, удаляет их и объединяет оставшиеся части в rand2
, а также удаляет их.Это решение предполагает, что строки в вашем файле сгруппированы по категориям и что единственные имена файлов, соответствующие x ???
в текущем каталоге, - это имена, созданные командой split
.