Quero imprimir a segunda última coluna ou campo no awk. O número de campos é variável. Eu sei que devo poder usar, $NFmas não tenho certeza de como ele pode ser usado.
Isso não funciona para mim. Eu recebo "title: 5: comando não encontrado: NF-1" no awk 3.1.8 no Ubuntu.
Gurgeh
3
Gostaria de evitar a pré / pós decrement para se certificar de que você não alterar o valor de US $ NF
Gregory Patmore
Isso quebra se você tentar obter o terceiro último campo comoawk -F '.' '{print $(NF-2)}'
gies0r
3
@ Gurgeh: Isso acontece porque $(..)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).
wting 14/10/18
21
Pequeno acréscimo à resposta aceita por Chris Kannon: imprima apenas se houver realmente uma segunda última coluna.
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.
Como mnemônico, esse comportamento é o mesmo que C / Java etc. int x = ++iint x = i++, prefixo significa incremento primeiro; postfix significa incremento mais tarde (atribuição primeiro).
NF
é o último índice de campo,$NF
é o valor do último campoRespostas:
Deveria trabalhar
fonte
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.
fonte
É mais simples:
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.fonte
int x = ++i
int x = i++
, prefixo significa incremento primeiro; postfix significa incremento mais tarde (atribuição primeiro).fonte
Você não estava longe do resultado! Faz isso:
Isso diminui o número de campos em um, para que
$NF
contenha o penúltimo ex.Teste
Vamos gerar alguns números e imprimi-los em grupos de 5:
Vamos imprimir o penúltimo em cada linha:
fonte
Solução Perl semelhante à solução awk de Chris Kannon:
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 linhasl
remove as novas linhas antes do processamento e as adiciona novamente depoisa
modo de divisão automática - divida as linhas de entrada na@F
matriz. O padrão é dividir em espaço em brancoe
executar o código perlA
@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
fonte
$F[-2]
Você tentou iniciar da direita para a esquerda usando o comando rev? Nesse caso, você só precisa imprimir a segunda coluna:
fonte
Primeiro diminui o valor e depois imprime -
OU
fonte
Se você tiver muitas colunas e quiser imprimir todos, exceto os três, no último, isso pode ajudar
awk '{ $NF="";$(NF-1)="";$(NF-2)="" ; print $0 }'
fonte