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.
Y esto no parece funcionar:
awk ' { print ( $NF-- ) } '
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.
Y esto no parece funcionar:
awk ' { print ( $NF-- ) } '
Respuestas:
awk '{print $(NF-1)}'
Deberia trabajar
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.
(
echo | awk 'NF && NF-1 { print ( $(NF-1) ) }'
echo 1 | awk 'NF && NF-1 { print ( $(NF-1) ) }'
echo 1 2 | awk 'NF && NF-1 { print ( $(NF-1) ) }'
echo 1 2 3 | awk 'NF && NF-1 { print ( $(NF-1) ) }'
)
Es más simple:
awk '{print $--NF}'
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.
int x = ++i int x = i++, etc. , prefijo significa incremento primero; postfix significa incremento posterior (asignación primero).
awk ' { print ( $(NF-1) ) }' file
¡No estabas lejos del resultado! Esto lo hace:
awk '{NF--; print $NF}' file
Esto disminuye el número de campos en uno, de modo que $NFcontiene el penúltimo anterior.
Generemos algunos números e imprimámoslos en grupos de 5:
$ seq 12 | xargs -n5
1 2 3 4 5
6 7 8 9 10
11 12
Imprimamos el penúltimo en cada línea:
$ seq 12 | xargs -n5 | awk '{NF--; print $NF}'
4
9
11
Solución Perl similar a la solución awk de Chris Kannon:
perl -lane 'print $F[$#F-1]' file
Se utilizan estas opciones de línea de comandos:
n recorra cada línea del archivo de entrada, no imprima automáticamente cada línea
l elimina las nuevas líneas antes del procesamiento y las agrega nuevamente
amodo de división automática: divide las líneas de entrada en la @Fmatriz. Por defecto se divide en espacios en blanco
e ejecuta el código perl
La @Fmatriz autosplit comienza en el índice [0] mientras que los campos awk comienzan con $ 1.
$#Fes el número de elementos en@F
$F[-2]
Primero disminuye el valor y luego lo imprime:
awk ' { print $(--NF)}' file
O
rev file|cut -d ' ' -f2|rev
NFes el último índice de campo,$NFes el valor del último campo