Digamos que tengo un archivo de texto realmente grande (aproximadamente 10,000,000 líneas). Lo necesito grep
desde el final y guardo el resultado en un archivo. ¿Cuál es la forma más eficiente de realizar la tarea?
command-line
sed
awk
grep
efficiency
caos
fuente
fuente
tac
ygrep
para lograr lo que quieres.grep
tiene un--max-count (number)
interruptor que se cancela después de un cierto número de coincidencias, lo que puede ser interesante para usted.Respuestas:
Solución tac / grep
O un poco más efectivo:
Tiempo con un archivo de 500 MB:
Solución sed / grep :
Tiempo con un archivo de 500 MB: cancelado después de más de 10 minutos.
Solución awk / grep :
Tiempo con un archivo de 500 MB:
Solución perl / grep :
Tiempo con un archivo de 500 MB:
fuente
sed
,awk
yperl
(con este método) no están bien ya que leen el archivo desde el principio, lo cual es muy ineficiente. Supongo que esotac
hace lo correcto.< <(tac filename)
debería ser tan rápido como una tubería: en ambos casos, los comandos se ejecutan en paralelo.tac
el grep después. Si tiene un archivo de 10,000,000 líneas, con solo 2 coincidencias,tac
solo tendrá que invertir 2 líneas, no 10m.grep
todavía va a tener que pasar por todo el asunto de cualquier manera.tac
después degrep
, se leerá desde una tubería y, por lo tanto, no puede buscar. Eso lo hará menos eficiente (o fallará por completo) si el número de líneas encontradas es grande.Esta solución podría ayudar:
fuente
tac
es el comando GNU En la mayoría de los otros sistemas, el equivalente estail -r
.tail -r
está limitado a un pequeño número de líneas, esto podría ser un problema.tail -r /etc/passwd
falla contail: invalid option -- 'r'
. Estoy usando coreutils-8.21-21.fc20.x86_64.tac
(y solo GNU tiene tac) muchas otras unidades tienentail -r
. GNUtail
no es compatible-r
Éste sale tan pronto como encuentra la primera coincidencia:
A continuación se muestran las 5 líneas antes y después de los dos primeros partidos:
Recuerde no usar
-i
(no distingue entre mayúsculas y minúsculas) a menos que tenga que hacerlo, ya que eso reducirá la velocidad.Si conoce la cadena exacta que está buscando, considere
fgrep
(Cadena fija)fuente
Si el archivo es muy grande, no puede caber en la memoria, voy a utilizar
Perl
con archivos :: ReadBackwards módulo desdeCPAN
:Entonces:
fuente
tac
.