Dividir un archivo y sus líneas en Linux/bash
-
09-06-2019 - |
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?
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)