Esto es simple, breve y fácil de escribir, comprender y verificar, y personalmente me gusta:
grep -oE '\S+$' file
grep
en Ubuntu , cuando se invoca con -E
o -P
, toma la abreviatura \s
para significar un carácter de espacio en blanco (en la práctica, generalmente un espacio o tabulación) y \S
significa cualquier cosa que no sea uno. Usando el cuantificador+
y el ancla de fin de línea$
, el patrón \S+$
coincide con uno o más espacios en blanco al final de una línea . Puedes usar en -P
lugar de -E
; el significado en este caso es el mismo pero se usa un motor de expresiones regulares diferente , por lo que pueden tener características de rendimiento diferentes .
Esto es equivalente a la solución comentada de Avinash Raj (solo con una sintaxis más fácil y compacta):
grep -o '[^[:space:]]\+$' file
Estos enfoques no funcionan si no puede haber espacios en blanco después del número. Pueden modificarse para que lo hagan, pero no veo ningún punto en entrar en eso aquí. Aunque a veces es instructivo generalizar una solución para trabajar en más casos, no es práctico hacerlo con tanta frecuencia como la gente tiende a suponer, porque generalmente no hay forma de saber en cuál de las muchas formas incompatibles diferentes el problema podría necesitar. ser generalizado
El rendimiento es a veces una consideración importante. Esta pregunta no estipula que la entrada es muy grande, y es probable que cada método que se haya publicado aquí sea lo suficientemente rápido. Sin embargo, en caso de que se desee velocidad, aquí hay un pequeño punto de referencia en un archivo de entrada de diez millones de líneas:
$ perl -e 'print((<>) x 2000000)' file > bigfile
$ du -sh bigfile
439M bigfile
$ wc -l bigfile
10000000 bigfile
$ TIMEFORMAT=%R
$ time grep -o '[^[:space:]]\+$' bigfile > bigfile.out
819.565
$ time grep -oE '\S+$' bigfile > bigfile.out
816.910
$ time grep -oP '\S+$' bigfile > bigfile.out
67.465
$ time cut -d= -f2 bigfile > bigfile.out
3.902
$ time grep -o '[^[:space:]]\+$' bigfile > bigfile.out
815.183
$ time grep -oE '\S+$' bigfile > bigfile.out
824.546
$ time grep -oP '\S+$' bigfile > bigfile.out
68.692
$ time cut -d= -f2 bigfile > bigfile.out
4.135
Lo ejecuté dos veces en caso de que el pedido importara (como a veces lo hace para tareas pesadas de E / S) y porque no tenía una máquina disponible que no estuviera haciendo otras cosas en segundo plano que pudieran sesgar los resultados. De esos resultados concluyo lo siguiente, al menos provisionalmente y para archivos de entrada del tamaño que utilicé:
¡Guauu! Pasar -P
(para usar PCRE ) en lugar de -G
(el valor predeterminado cuando no se especifica un dialecto) o se -E
hace grep
más rápido en un orden de magnitud. Entonces, para archivos grandes, puede ser mejor usar este comando que el que se muestra arriba:
grep -oP '\S+$' file
¡¡GUAU!! El cut
método de la respuesta de αғsнιη , es más de un orden de magnitud más rápido que incluso la versión más rápida de mi camino! También fue el ganador en el punto de referencia de pa4080 , que cubrió más métodos que este pero con una entrada menor, y es por eso que lo elegí, de todos los otros métodos, para incluir en mi prueba. Si el rendimiento es importante o los archivos son enormes, creo que debería usarse el método de αғsнιη .cut -d= -f2 file
cut
Esto también sirve como un recordatorio de que lo simple cut
y las paste
utilidades no deberían olvidarse , y tal vez deberían preferirse cuando corresponda, a pesar de grep
que a menudo se ofrecen herramientas más sofisticadas como soluciones de primera línea (y que yo personalmente estoy más acostumbrado) a usar).
grep -o '[^[:space:]]\+$' file