У меня есть текстовый файл, который похож на это:
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), и каждый содержит 1 000 строк (так 100 * 1,000 = 100 000 строк всего).
Я хотел бы разделить этот файл на две случайных половины, т.е. одна половина содержит 50 случайных категорий, и другая половина содержит другие 50 категорий.
Этот делает это тот путь, это переставляет каждую главу и проводит "lineswanted" строки от результата для окончательного хранения его в обеих половинах файлов:
#!/bin/bash
lineswanted=300
infile="full"
half1="half1"
half2="half2"
# 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`"
rm -f "$half1" "$half2"
i=0
for chapter in $randomchapterlist ; do
if [ $i -lt 50 ] ; then
egrep ".*\ $chapter\$" "$infile" | shuf | head -n $lineswanted >> "$half1"
else
egrep ".*\ $chapter\$" "$infile" | shuf | head -n $lineswanted >> "$half2"
fi
i=$(( i+1 ));
done
Можно выполнить шаги ниже, чтобы сделать работу:
, В первую очередь, разделяет этот файл на 100 файлов категорий с использованием:
sed -n '0,99p' file >> 1.txt
для первой категории.
Теперь у Вас есть 100 файлов: 1.txt, 2.txt...., 100.txt. Каждый из этих файлов имеет 1 000 строк. можно выбрать строку из этих файлов случайным образом следующей командой и вставить firsthalf.txt и secondhalf.txt:
shuf -n 1 filename
На каждом из вышеупомянутых шагов можно использовать циклы для улучшения скорости.
Этот сценарий должен сделать это. В обеих половинах файлов строки главы отсортированы как во входном файле, но главы самом переставляются. Если Вам нужно. Я могу расширить сценарий, чтобы отсортировать главы в каждой половине или переставить строки всей главы в одном файле, также.
#!/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