Tengo un archivo de texto de 250 MB, todo en una línea.
En este archivo quiero reemplazar a
caracteres con b
caracteres:
sed -e "s/a/b/g" < one-line-250-mb.txt
Falla con:
sed: couldn't re-allocate memory
Me parece que este tipo de tarea podría realizarse en línea sin asignar mucha memoria.
¿Existe una mejor herramienta para el trabajo o una mejor manera de usarla sed
?
GNU sed versión 4.2.1
Ubuntu 12.04.2 LTS
1 GB RAM
text-processing
sed
performance
large-files
out-of-memory
Nicolas Raoul
fuente
fuente
Respuestas:
Sí, use
tr
en su lugar:sed
trata en líneas, por lo que una línea enorme le causará problemas. Espero que declare una variable internamente para mantener la línea y su entrada excede el tamaño máximo asignado a esa variable.tr
por otro lado, trata con caracteres y debería poder manejar líneas largas arbitrariamente correctamente.fuente
sed -e "s/a/z/g" b.txt > c.txt
sin ningún problema. Uso de sed (GNU sed) 4.2.2.sed
versión, supongo que depende de la implementación o el hardware.sed
.Las versiones históricas de sed y awk tenían problemas de memoria, en su mayoría se han solucionado en versiones más recientes, pero uno de los casos clásicos de este problema golpeó bastante a Larry Wall . su respuesta fue escribir un nuevo lenguaje de programación, sin límites de memoria que no sean hardware. Lo llamó perl. su problema específico se puede resolver de manera más simple, pero la regla general que uso es cuando sed no usará perl.
Editar: por solicitud un ejemplo:
o por menos uso de memoria:
fuente
sed
Aunque un poco decepcionado . : \