Todo lo que quiero son las dos últimas columnas impresas.
Todo lo que quiero son las dos últimas columnas impresas.
Respuestas:
Puede hacer uso de la variable NF
que se establece en el número total de campos en el registro de entrada:
awk '{print $(NF-1),"\t",$NF}' file
esto supone que tiene al menos 2 campos.
awk '{print $(NF-1) "\t" $NF}' file
o awk '{print $(NF-1), $NF}' file
o awk 'BEGIN{OFS="\t"} {print $(NF-1), $NF}' file
.
'{print $x,"\t",$y}'
es que awk interpreta cada variable separada por comas como su propio campo, por lo que el resultado será en realidad field1<space><tab><space>field2
, (porque usará el delimitador de espacios en blanco de forma predeterminada) en lugar de lo field1<tab>field2
que probablemente sea lo que estás esperando. usar el Separador de campo de salida (OFS) es casi siempre lo que desea.
awk '{print $NF-1, $NF}' inputfile
Nota: esto solo funciona si existen al menos dos columnas. En registros con una columna obtendrá un falso"-1 column1"
echo 1 2 3 | awk ...
. $NF-1
está ($NF) - 1
en cada awk
implementación.
yacc
gramática, lo cual es irónico dado lo que la A significa en awk. ¿Diferentes versiones de awk analizando las cosas de manera diferente? ¡Gran sorpresa!
echo '5 4 3 2 1' | awk '{print $NF-1,$NF; print $(NF-1), $NF}'
- o cualquier otra entrada donde el segundo último campo no sea uno menos que el último campo.
@jim mcnamara: intente usar paréntesis para alrededor NF
, es decir, $(NF-1)
y en $(NF)
lugar de $NF-1
y $NF
(funciona en Mac OS X 10.6.8 para FreeBSD awk
y gawk
).
echo '
1 2
2 3
one
one two three
' | gawk '{if (NF >= 2) print $(NF-1), $(NF);}'
# output:
# 1 2
# 2 3
# two three
$(NF-1)
, que al menos es más portátil que $NF-1
; definitivamente es menos ambiguo. $(NF)
Sin embargo, es exagerado, solo $NF
servirá. También vale la pena protegerse contra las líneas con menos de 2 columnas, ya que con las líneas de una columna obtendría el valor de la primera columna dos veces , y con las líneas de columna cero, es decir, vacías, el comando awk fallaría por completo, debido a un intento para acceder a un campo con índice -1.
el uso de gawk presenta el problema:
gawk '{ print $NF-1, $NF}' filename
1 2
2 3
-1 one
-1 three
# cat filename
1 2
2 3
one
one two three
Acabo de poner boquiabierto a Solaris 10 M4000: Entonces, gawk es el cuplrit en el problema de $ NF-1 vs. $ (NF-1). Siguiente pregunta ¿qué dice POSIX? por:
http://www.opengroup.org/onlinepubs/009695399/utilities/awk.html
No hay dirección en un sentido u otro. No está bien. gawk implica resta, otros awks implican número de campo o resta. hmm.
$(NF-1)
es que los dos ejemplos de cálculo del índice de campo en la especificación usan esa forma: $(NF-1)
y $(NF+2)
. Luego está la sección "Expresiones en awk", que $expr
tiene una precedencia [mucho] mayor que expr - expr
. Dado que NF
es una expresión en sí misma, $NF-1
debería evaluarse como ($NF)-1
. Incluso SI, después de todo, existen implementaciones de awk que evalúan $NF-1
como $(NF-1)
, la lección aprendida aquí es que usar $(NF-1)
es la opción segura y portátil.
prueba con esto
$ cat /tmp/topfs.txt
/dev/sda2 xfs 32G 10G 22G 32% /
awk print last column
$ cat /tmp/topfs.txt | awk '{print $NF}'
awk print before last column
$ cat /tmp/topfs.txt | awk '{print $(NF-1)}'
32%
awk - print last two columns
$ cat /tmp/topfs.txt | awk '{print $(NF-1), $NF}'
32% /
Pruebe esto para tener en cuenta todos los escenarios posibles:
awk '{print $(NF-1)"\t"$NF}' file
o
awk 'BEGIN{OFS="\t"}' file
o
awk '{print $(NF-1), $NF} {print $(NF-1), $NF}' file