У меня есть текстовый файл, который выглядит так:
train/a/abbey/00000001.jpg 0
...
train/a/abbey/00000999.jpg 0
train/a/abbey/00001000.jpg 0
train/a/airport_terminal/00000001.jpg 1
train/a/airport_terminal/00000002.jpg 1
...
train/c/corn_field/00000354.jpg 40
train/c/corn_field/00000355.jpg 40
train/c/corn_field/00000356.jpg 40
...
train/y/yard/00000998.jpg 99
train/y/yard/00000999.jpg 99
train/y/yard/00001000.jpg 99
Последнее число в каждой строке - это категория. У меня есть 100 категорий (от 0 до 99), каждая из которых содержит 1000 строк (так 100 * 1000 = 100 000 строк).
Я хотел бы разбить этот файл на две случайные половины, т. е. половина содержит 50 случайных категорий, а другая половина содержит остальные 50 категорий.
Вы можете выполнить следующие шаги, чтобы выполнить вашу работу:
Прежде всего, разделите этот файл на 100 файлов категорий с использованием:sed -n '0,99p' file >> 1.txt
для первой категории.
Прежде всего, разделите этот файл на 100 файлов категорий с помощью:sed -n '0,99p' file >> 1.txt
Прежде всего, разделите этот файл на 100 файлов категорий с помощью:
Этот скрипт должен это сделать. В обоих половинных файлах строки разделов сортируются как во входном файле, но сами главы перетасовываются. Если тебе надо. Я могу расширить скрипт для сортировки глав в каждой половине или перетасовать строки всей главы в одном файле.
#!/bin/bash
# Build chapterlist 0 1 2 3 ....
chapterlist=""
for (( i=0 ; i<100; i=i+1 )) ; do
chapterlist="$chapterlist $i"
done
# shuffle chapterlist
randomchapterlist="`shuf -e $chapterlist`"
# "full" is input file
# half1 and half2 are output files
rm -f half1 half2
i=0
for chapter in $randomchapterlist ; do
if [ $i -lt 50 ] ; then
egrep ".*\ $chapter\$" full >> half1
else
egrep ".*\ $chapter\$" full >> half2
fi
i=$(( i+1 ));
done