AWK - imprime a última coluna junto com o valor vazio

AWK - imprime a última coluna junto com o valor vazio

Podemos imprimir a última coluna de cada linha em um arquivo $NFse não soubermos o número da última coluna.

Mas estou enfrentando dificuldade é que a última coluna tem um valor vazio.

Por exemplo,whoComando de análise

$ who
root     tty1         2018-01-25 09:36
root     pts/0        2018-05-30 07:39 (192.168.1.134)
root     pts/1        2018-05-28 23:12 (192.168.1.134)
root     pts/2        2018-06-01 10:01 (192.168.1.188)

Obtendo resultado:

$ who | awk '{print $NF}'
09:36
(192.168.1.134)
(192.168.1.134)
(192.168.1.188)

resultado esperado

(192.168.1.134)
(192.168.1.134)
(192.168.1.188)

Deixe-me saber as possibilidades de obter o resultado esperado em uma linha.

EDITAR 1:O cenário acima é apenas um exemplo. Não gosto de alterar o delimitador para obter o resultado.

EDITAR 2:nada (uma linha de saída vazia) das linhas que possuem menos campos que o máximo

Responder1

Para gerar apenas a última coluna de linhas que possui o número máximo de colunas, você poderia fazer algo como:

who | awk '
  NF > max  {max = NF; output = ""}
  NF == max {output = output $NF ORS}
  END       {printf "%s", output}'

Para gerar uma linha para cada linha de entrada, mas vazia para linhas que não possuem o número máximo de colunas:

who | awk '
  NF > max {max = NF}
  {n[NR] = NF}
  NF == max {last[NR] = $NF}
  END {for (i = 1; i <= NR; i++) print n[i] == max ? last[i] : ""}'

Responder2

Se você quiser o último campo apenas das linhas que possuem mais campos, você precisará ler os dados duas vezes: uma vez para descobrir o maior número de campos e outra para imprimir os campos. Ler apenas uma vez não resolve: qualquer linha pode ter mais campos do que as anteriores, e não há como saber.

Com awk(observe que o nome do arquivo é fornecido duas vezes):

awk -vfields=0 'FNR==NR {if (NF > fields) fields=NF; next} 
     NF >= fields { print $NF } NF < fields {print ""}' file file

Se filecontém

foo bar
one two three four
1 2 3
a b c d

isso imprime o quarto campo ou fica vazio para linhas que não o possuem:

quatro

d

Isso, claro, não funciona com um pipe, você terá que usar um arquivo temporário.

Uma solução alternativa poderia armazenar em cache os campos a serem impressos até que uma linha com mais campos apareça, como emA resposta de Stéphane.

Responder3

Verifique se o quinto campo corresponde \(.*\)e imprima-o se corresponder.

who | awk '$5 ~ /\(.*\)/{print $5}'

Se você estiver interessado apenas em ipendereços, altere o regex:

who |  awk '$5 ~ /\((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\)/{print $5}'

Responder4

Se você deseja obter apenas a última coluna se esta coluna estiver disponível, use o fato de que as linhas que vocênãoquero ter apenas quatro colunas:

who | awk 'NF > 4 { print $NF }'

ou, para obter dados semelhantes,

w -hi | awk '{ print $3 }'

informação relacionada