Tengo un archivo de texto que se ve así:
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
El último número en cada línea es la categoría. Tengo 100 categorías (0 a 99) y cada una contiene 1,000 líneas (entonces 100 * 1,000 = 100,000 líneas en total).
Me gustaría dividir este archivo en dos aleatorio mitades, es decir, una mitad contiene 50 categorías aleatorias y la otra mitad contiene las otras 50 categorías.
Éste lo hace de esa manera, baraja cada capítulo y toma líneas "líneas deseadas" del resultado para finalmente almacenarlo en los dos medios archivos:
#!/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
Puede seguir los pasos a continuación para realizar su trabajo:
En primer lugar, divida este archivo en archivos de 100 categorías con el uso de:
sed -n '0,99p' file >> 1.txt
para la primera categoría.
Ahora tiene 100 archivos: 1.txt, 2.txt, ...., 100.txt. Cada uno de estos archivos tiene 1000 líneas. Puede seleccionar una línea de estos archivos al azar siguiendo el comando y poner firsthalf.txt y secondhalf.txt:
shuf -n 1 filename
En cada uno de los pasos anteriores, puede usar bucles para mejorar su velocidad.
Este script debería hacerlo. En los dos medios archivos, las líneas de los capítulos se ordenan como en el archivo de entrada, pero los capítulos en sí se barajan. Si necesitas. Puedo extender el guión para ordenar los capítulos en cada mitad o mezclar las líneas de todos los capítulos en un archivo, también.
#!/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