echo -e 'one two three\nfour five six\nseven eight nine'
one two three
four five six
seven eight nine
¿Cómo puedo hacer algo de "MAGIA" para obtener esta salida ?:
three
six
nine
ACTUALIZACIÓN: No lo necesito de esta manera específica, necesito una solución general para que no importa cuántas columnas estén en fila, por ejemplo: awk siempre muestra la última columna.
text-processing
awk
LanceBaynes
fuente
fuente
Respuestas:
Incluso se puede hacer sólo con
'bash'
, y sin'sed'
,'awk'
o'perl'
:fuente
... | while read -r line; do echo ${line##* }; done
bash
El índice de matriz es objeto de evaluación aritmética, por lo queecho ${line[nb - 1]}
es suficiente. Como hablarbash
, puede saltarse las cosas “NB”:echo ${line[-1]}
. Una alternativa más portátil de la tarde:echo ${line[@]: -1]}
. (Ver el comentario de Stephane Chazelas sobre índices negativos en otra parte.)Tratar:
fuente
ps -ef | awk '{ print $NF }'
tenía algunas líneas truncadas ...) Perl no tiene esa limitación. ( gnu.org/software/autoconf/manual/autoconf-2.67/html_node/… : "Awk tradicional tiene un límite de 99 campos en un registro. Dado que algunas implementaciones de Awk, como Tru64, dividen la entrada incluso si no hace referencia a cualquier campo en el script, para evitar este problema, establezca 'FS' en un carácter inusual y use división ".awk
implementaciones tienen esa limitación? Nunca lo he visto. Mimawk
voluntad se ahoga32768
pero migawk
yigawk
puede lidiar con millones felizmente. Incluso mi busyboxawk
puede lidiar con millones. Nunca me he encontrado con unawk
que no pueda manejar 100 campos, después de todo es un número muy pequeño. ¿Estás seguro de que la información sigue siendo relevante? ¿Incluso en Solaris?Es más fácil de lo que piensas.
fuente
Pruebe
grep
(más corto / más simple, pero 3 veces más lento queawk
por el uso de expresiones regulares):O
ex
(aún más lento, pero imprime todo el búfer después de terminar, más útil cuando necesita ser ordenado o editado en el lugar):Para cambiar en el lugar, reemplace
-sc'%p|q!'
con-scwq
.O
bash
:Actuación
Dado el archivo generado de 1GB a través de:
He realizado las estadísticas de tiempo de análisis (ejecuté ~ 3x y tomé el más bajo, probado en MBP OS X):
utilizando
awk
:utilizando
grep
:utilizando
perl
:usando
rev
+cut
:utilizando
ex
:utilizando
bash
:fuente
fuente
-a
autosplit campos en@F
matriz;-l
corta$/
(separador de registro de entrada) y lo guarda en$\
(separador de registro de salida). Como no se proporciona ningún número octal-l
, el original$/
se aplica en forma impresa (terminaciones de línea);-n
código de bucle;-e
ejecutar código inmediatamente de aquí en adelante. Verman perlrun
.También se puede hacer usando
'sed'
:Actualizar:
o más simplemente:
fuente
O usando
cut
:aunque esto no satisface el requisito de "solución general". Usando
rev
dos veces podemos resolver esto también:fuente
rev
no funciona con caracteres 'anchos', solo de un solo byte, que yo sepa.Utilizando
awk
, primero puede verificar si hay al menos una columna.fuente
awk 'NF{print $NF}'
.En perl esto se puede hacer de la siguiente manera:
salida:
También puede recorrer un archivo, aquí hay un script de ejemplo que escribí para analizar un archivo llamado budget.dat
datos de ejemplo en budget.dat:
(puede ver que necesitaba capturar solo la "última" columna, no solo la columna 2)
La secuencia de comandos:
fuente