Quiero imprimir la segunda última columna o campo en awk. El número de campos es variable. Sé que debería poder usar, $NFpero no estoy seguro de cómo se puede usar.
Esto no funciona para mi. Obtengo "title: 5: comando no encontrado: NF-1" en awk 3.1.8 en Ubuntu.
Gurgeh
3
Evitaría la disminución previa / posterior para asegurarme de que no cambie el valor de $ NF
Gregory Patmore
Esto se rompe si intentas obtener el tercer último campo comoawk -F '.' '{print $(NF-2)}'
gies0r
3
@Gurgeh: Esto sucede porque $(..)invoca un comando en un subshell dependiendo del shell que esté utilizando. Puede solucionar esto utilizando en $ (NF-1)lugar de $(NF-1).
wting
21
Pequeña adición a la respuesta aceptada de Chris Kannon: solo imprima si realmente hay una segunda última columna.
La razón por la que el original $NF--no funcionó es porque la expresión se evalúa antes de la disminución, mientras que mi disminución de prefijo se realiza antes de la evaluación.
Como mnemónico, este comportamiento es el mismo que C / Java int x = ++iint x = i++, etc. , prefijo significa incremento primero; postfix significa incremento posterior (asignación primero).
NF
es el último índice de campo,$NF
es el valor del último campoRespuestas:
Deberia trabajar
fuente
awk -F '.' '{print $(NF-2)}'
$(..)
invoca un comando en un subshell dependiendo del shell que esté utilizando. Puede solucionar esto utilizando en$ (NF-1)
lugar de$(NF-1)
.Pequeña adición a la respuesta aceptada de Chris Kannon: solo imprima si realmente hay una segunda última columna.
fuente
Es más simple:
La razón por la que el original
$NF--
no funcionó es porque la expresión se evalúa antes de la disminución, mientras que mi disminución de prefijo se realiza antes de la evaluación.fuente
int x = ++i
int x = i++
, etc. , prefijo significa incremento primero; postfix significa incremento posterior (asignación primero).fuente
¡No estabas lejos del resultado! Esto lo hace:
Esto disminuye el número de campos en uno, de modo que
$NF
contiene el penúltimo anterior.Prueba
Generemos algunos números e imprimámoslos en grupos de 5:
Imprimamos el penúltimo en cada línea:
fuente
Solución Perl similar a la solución awk de Chris Kannon:
Se utilizan estas opciones de línea de comandos:
n
recorra cada línea del archivo de entrada, no imprima automáticamente cada líneal
elimina las nuevas líneas antes del procesamiento y las agrega nuevamentea
modo de división automática: divide las líneas de entrada en la@F
matriz. Por defecto se divide en espacios en blancoe
ejecuta el código perlLa
@F
matriz autosplit comienza en el índice [0] mientras que los campos awk comienzan con $ 1.$#F
es el número de elementos en@F
fuente
$F[-2]
¿Intentaste comenzar de derecha a izquierda usando el comando rev? En este caso solo necesita imprimir la segunda columna:
fuente
Primero disminuye el valor y luego lo imprime:
O
fuente
Si tiene muchas columnas y desea imprimir todas pero no las tres nubes en la última, entonces esto podría ayudar
awk '{ $NF="";$(NF-1)="";$(NF-2)="" ; print $0 }'
fuente