Quiero imprimir la segunda última columna o campo en awk. El número de campos es variable. Sé que debería poder usar, $NF
pero 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, $NF
pero 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 $NF
contiene 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
a
modo de división automática: divide las líneas de entrada en la @F
matriz. Por defecto se divide en espacios en blanco
e
ejecuta el código perl
La @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
$F[-2]
Primero disminuye el valor y luego lo imprime:
awk ' { print $(--NF)}' file
O
rev file|cut -d ' ' -f2|rev
NF
es el último índice de campo,$NF
es el valor del último campo