Quero imprimir a segunda última coluna ou campo no awk. O número de campos é variável. Eu sei que devo poder usar, $NF
mas não tenho certeza de como ele pode ser usado.
E isso não parece funcionar:
awk ' { print ( $NF-- ) } '
Quero imprimir a segunda última coluna ou campo no awk. O número de campos é variável. Eu sei que devo poder usar, $NF
mas não tenho certeza de como ele pode ser usado.
E isso não parece funcionar:
awk ' { print ( $NF-- ) } '
Respostas:
awk '{print $(NF-1)}'
Deveria trabalhar
awk -F '.' '{print $(NF-2)}'
$(..)
chama um comando em um subshell, dependendo de qual shell você está usando. Você pode contornar isso usando em $ (NF-1)
vez de $(NF-1)
.
Pequeno acréscimo à resposta aceita por Chris Kannon: imprima apenas se houver realmente uma segunda última coluna.
(
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) ) }'
)
É mais simples:
awk '{print $--NF}'
A razão pela qual o original $NF--
não funcionou é porque a expressão é avaliada antes do decremento, enquanto o meu decremento de prefixo é realizado antes da avaliação.
int x = ++i
int x = i++
, prefixo significa incremento primeiro; postfix significa incremento mais tarde (atribuição primeiro).
awk ' { print ( $(NF-1) ) }' file
Você não estava longe do resultado! Faz isso:
awk '{NF--; print $NF}' file
Isso diminui o número de campos em um, para que $NF
contenha o penúltimo ex.
Vamos gerar alguns números e imprimi-los em grupos de 5:
$ seq 12 | xargs -n5
1 2 3 4 5
6 7 8 9 10
11 12
Vamos imprimir o penúltimo em cada linha:
$ seq 12 | xargs -n5 | awk '{NF--; print $NF}'
4
9
11
Solução Perl semelhante à solução awk de Chris Kannon:
perl -lane 'print $F[$#F-1]' file
Essas opções de linha de comando são usadas:
n
faça um loop em todas as linhas do arquivo de entrada, não imprima automaticamente todas as linhas
l
remove as novas linhas antes do processamento e as adiciona novamente depois
a
modo de divisão automática - divida as linhas de entrada na @F
matriz. O padrão é dividir em espaço em branco
e
executar o código perl
A @F
matriz de divisão automática inicia no índice [0] enquanto os campos awk começam com $ 1.
$#F
é o número de elementos em@F
$F[-2]
Primeiro diminui o valor e depois imprime -
awk ' { print $(--NF)}' file
OU
rev file|cut -d ' ' -f2|rev
NF
é o último índice de campo,$NF
é o valor do último campo