Нахождение максимума добавленных полей

Учитывая текстовый файл numbers.data:

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

Поля, разграниченные двоеточием, что является самым простым awk команда, чтобы добавить вторые, третьи, и четвертые поля и найти максимум из четырех показанных записей? Если возможно, как распечатать первое поле (имя) человека с этой максимальной полевой суммой?

Т.е. дисплей: Logan 877 и сохраните его к переменной.

3
задан 1 November 2016 в 06:49

2 ответа

Можно сделать:

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: наборы разделитель полей как :

  • {for(i=2;i<=NF;i++) sum[$1]+=$i} выполняет итерации по полям и создает массив sum со значениями полей, начинающими со второго добавленного

  • В конце (END), for(j in sum) if (sum[j] > max) {n=j; max=sum[j]}; print n, max} выполняет итерации по элементам массива, и найдите максимальное количество и распечатайте его с именем в передней стороне

Пример:

% 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
4
ответ дан 1 December 2019 в 15:23

С GNU awk> 4.0, Вы могли постараться не писать явную макс. функцию путем сортировки массива и печати первой пары "имя-значение":

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
2
ответ дан 1 December 2019 в 15:23

Другие вопросы по тегам:

Похожие вопросы: