it-swarm-es.tech

dividir el archivo de texto a la mitad según el patrón

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.

1
apples-oranges

É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
1
cmks

Puede seguir los pasos a continuación para realizar su trabajo:

  1. 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.

  1. 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
    
  2. En cada uno de los pasos anteriores, puede usar bucles para mejorar su velocidad.

1
Mahdi

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
1
cmks