Учитывая текстовый файл numbers.data
:
James:230:200:200
Kory:140:204:240
Hogan:293:234:100
Logan:233:444:200
Поля, разграниченные двоеточием, что является самым простым awk
команда, чтобы добавить вторые, третьи, и четвертые поля и найти максимум из четырех показанных записей? Если возможно, как распечатать первое поле (имя) человека с этой максимальной полевой суммой?
Т.е. дисплей: Logan 877
и сохраните его к переменной.
Можно сделать:
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
С 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