Pregunta

Tengo un archivo bastante grande (150 millones de líneas de 10 caracteres).Necesito dividirlo en 150 archivos de 2 millones de líneas, siendo cada línea de salida alternativamente los primeros 5 caracteres o los últimos 5 caracteres de la línea de origen.Podría hacer esto en Perl con bastante rapidez, pero me preguntaba si había una solución sencilla usando bash.¿Algunas ideas?

¿Fue útil?

Solución

¿Tarea?:-)

Creo que una tubería simple con sed (para dividir cada línea en dos) y split (para dividir cosas en varios archivos) sería suficiente.

El comando man es tu amigo.


Agregado después de confirmar que no es tarea:

Qué tal si

sed 's/\(.....\)\(.....\)/\1\n\2/' input_file | split -l 2000000 - out-prefix-

?

Otros consejos

Creo que algo como esto podría funcionar:

out_file=1
out_pairs=0
cat $in_file | while read line; do
    if [ $out_pairs -gt 1000000 ]; then
        out_file=$(($out_file + 1))
        out_pairs=0
    fi
    echo "${line%?????}" >> out${out_file}
    echo "${line#?????}" >> out${out_file}
    out_pairs=$(($out_pairs + 1))
done

Sin embargo, no estoy seguro de si es más simple o más eficiente que usar Perl.

Los primeros cinco caracteres de cada variante de línea, asumiendo que el archivo grande se llama x.txt y asumiendo que está bien crear archivos en el directorio actual con nombres x.txt.* :

split -l 2000000 x.txt x.txt.out && (para archivo dividido en x.txt.out*;hacer outfile="${splitfile}.firstfive";echo "$archivo dividido -> $archivo de salida";cut -c 1-5 "$archivo dividido" > "$archivo de salida";hecho)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top