Encontrando o máximo de campos adicionados

3

Dado um arquivo de texto numbers.data :

James:230:200:200
Kory:140:204:240
Hogan:293:234:100
Logan:233:444:200

Campos delimitados por dois pontos, qual é o comando awk mais simples para adicionar o segundo, terceiro e quarto campos e encontrar o máximo dos quatro registros mostrados? Se possível, como imprimir o primeiro campo (nome) do indivíduo com esta soma máxima de campo?

Ou seja. exibir: Logan 877 e armazená-lo em uma variável.

    
por KMoy 01.11.2016 / 03:51

2 respostas

4

Você pode fazer:

awk -F: '{for(i=2;i<=NF;i++) sum[$1]+=$i} END{for(j in sum) if (sum[j] > max) \
           {n=j; max=sum[j]}; print n, max}' file.txt
  • -F: define o separador de campo como :

  • {for(i=2;i<=NF;i++) sum[$1]+=$i} itera sobre os campos e cria uma matriz sum com os valores do campo a partir da segunda adicionada

  • No final ( END ), for(j in sum) if (sum[j] > max) {n=j; max=sum[j]}; print n, max} itera sobre os elementos da matriz e encontra o número máximo e imprime com o nome na frente

Exemplo:

% cat file.txt
James:230:200:200
Kory:140:204:240
Hogan:293:234:100
Logan:233:444:200

% awk -F: '{for(i=2;i<=NF;i++) sum[$1]+=$i} END{for(j in sum) if (sum[j] > max) {n=j; max=sum[j]}; print n, max}' file.txt
Logan 877
    
por heemayl 01.11.2016 / 04:02
2

Com o GNU awk > 4.0, você pode evitar escrever uma função max explícita classificando a matriz e imprimindo o primeiro par nome / valor:

gawk -F: '
  {a[$1]=0+$2+$3+$4} 
  END {PROCINFO["sorted_in"]="@val_num_desc"; for (i in a){print i,a[i]; break}}
' file
Logan 877
    
por steeldriver 01.11.2016 / 04:22