Necesito dividir un archivo de registro grande en otros más pequeños según la identificación que se encuentra en la primera columna, esta solución funcionó de maravilla y muy rápido durante meses:
awk -v dir="$nome" -F\; '{print>dir"/"dir"_"$1".log"}' ${nome}.all;
Donde $nome es un nombre de archivo y directorio.
Es muy rápido y funcionó hasta que el archivo de registro alcanzó varios millones de líneas +2 GB de archivo de texto, luego comenzó a mostrar
"Too many open files"
De hecho, la solución es muy simple, agregando el comando de cierre:
awk -v dir="$nome" -F\; '{print>dir"/"dir"_"$1".log"; close(dir"/"dir"_"$1".log")}' ${nome}.all;
El problema es que ahora es MUY lento, tarda una eternidad en hacer algo que se hizo en segundos y necesito optimizarlo.
AWK no es obligatorio, puedo usar una alternativa, simplemente no sé cómo
No probado ya que no proporcionó ninguna entrada/salida de muestra para probar, pero esto debería hacerlo:
sort -t';' -k1,1 "${nome}.all" | awk -v dir="$nome" -F\; '$1!=prev{close(out); out=dir"/"dir"_"$1".log"; prev=$1} {print > out}'
Su primer guión:
awk -v dir="$nome" -F\; '{print>dir"/"dir"_"$1".log"}' ${nome}.all;
tenia 3 problemas:
${nome}
en el nombre del archivo.Vale la pena mencionar que gawk podría manejar 1 y 2 sin fallar, pero se ralentizaría a medida que creciera la cantidad de archivos abiertos y tuviera que administrar las aperturas/cierres internamente.
Su segundo guión:
awk -v dir="$nome" -F\; '{print>dir"/"dir"_"$1".log"; close(dir"/"dir"_"$1".log")}' ${nome}.all;
aunque ahora cerró el nombre del archivo de salida, todavía tenía los problemas 2 y 3 y luego agregó 2 nuevos problemas:
Lo anterior supone que tiene varias líneas de entrada para cada $1, por lo que cada archivo de salida tendrá varias líneas. De lo contrario, la desaceleración que vio al cerrar los archivos de salida no habría ocurrido.
La sort
anterior podría reorganizar el orden de las líneas de entrada para cada $1. Si eso es un problema, agregue -s
para "clasificación estable" si tiene clasificación GNU o infórmenos, ya que es fácil de solucionar con las herramientas POSIX.