Разбить текстовый файл пополам на основе шаблона
У меня есть текстовый файл, который выглядит так:
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 категорий.
3 ответа
Этот делает это таким образом, он перетасовывает каждую главу и извлекает строки из строки, чтобы окончательно сохранить их в обеих половинных файлах:
#!/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. Каждый из этих файлов имеет 1000 строк. Вы можете выбрать строку из этих файлов случайным образом, выполнив следующую команду, и поместите в 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