Tudo que eu quero são as duas últimas colunas impressas.
Tudo que eu quero são as duas últimas colunas impressas.
Respostas:
Você pode usar a variável NF
que é definida como o número total de campos no registro de entrada:
awk '{print $(NF-1),"\t",$NF}' file
isso pressupõe que você tenha pelo menos 2 campos.
awk '{print $(NF-1) "\t" $NF}' file
ou awk '{print $(NF-1), $NF}' file
ou awk 'BEGIN{OFS="\t"} {print $(NF-1), $NF}' file
.
'{print $x,"\t",$y}'
é que awk interpreta cada variável separada por vírgula como seu próprio campo, então o resultado será field1<space><tab><space>field2
, (porque ele usará delimitador de espaço em branco por padrão) ao contrário do field1<tab>field2
que provavelmente é o que você está esperando. usar o separador de campo de saída (OFS) é quase sempre o que você deseja.
awk '{print $NF-1, $NF}' inputfile
Nota: isso funciona apenas se houver pelo menos duas colunas. Em registros com uma coluna, você obterá um espúrio"-1 column1"
echo 1 2 3 | awk ...
. $NF-1
está ($NF) - 1
em cada awk
implementação.
yacc
gramática, o que é irônico dado o que o A significa em awk. Versões diferentes do awk analisando as coisas de maneira diferente? Grande surpresa!
echo '5 4 3 2 1' | awk '{print $NF-1,$NF; print $(NF-1), $NF}'
- ou qualquer outra entrada onde o segundo último campo não seja um a menos que o último campo.
@jim mcnamara: tente usar parênteses ao redor NF
, ou seja, $(NF-1)
e ao $(NF)
invés de $NF-1
e $NF
(funciona no Mac OS X 10.6.8 para FreeBSD awk
e 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 no mínimo é mais portátil do que $NF-1
; é definitivamente menos ambíguo. $(NF)
é um exagero - apenas $NF
servirá. Também vale a pena se proteger contra linhas com menos de 2 colunas, pois com linhas de uma coluna você obteria o valor da primeira coluna duas vezes , e com linhas zero - ou seja, vazias - o comando awk falharia completamente, devido a uma tentativa para acessar um campo com índice -1.
usar o gawk exibe o 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
Acabei de colocar gawk no Solaris 10 M4000: Então, gawk é o cuplrit na questão $ NF-1 vs. $ (NF-1). Próxima pergunta, o que POSIX diz? por:
http://www.opengroup.org/onlinepubs/009695399/utilities/awk.html
Não há direção de um jeito ou de outro. Não é bom. gawk implica subtração, outros awks implicam número de campo ou subtração. Hmm.
$(NF-1)
é que os dois exemplos de cálculo do índice de campo na especificação usam essa forma: $(NF-1)
e $(NF+2)
. Depois, há a seção "Expressões no awk", que lista os $expr
nomes com precedência [muito] maior do que expr - expr
. Uma vez que NF
é uma expressão em si, $NF-1
deve avaliar como ($NF)-1
. Mesmo se, afinal, houver implementações awk por aí que avaliam $NF-1
como $(NF-1)
, a lição aprendida aqui é que usar $(NF-1)
é a escolha segura e portátil.
tente com isso
$ 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% /
Tente fazer isso levando em consideração todos os cenários possíveis:
awk '{print $(NF-1)"\t"$NF}' file
ou
awk 'BEGIN{OFS="\t"}' file
ou
awk '{print $(NF-1), $NF} {print $(NF-1), $NF}' file