查找添加字段的最大值

查找添加字段的最大值

给定一个文本文件numbers.data

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

字段以冒号分隔,最简单的awk命令是什么来添加第二、第三和第四个字段并从显示的四个记录中找出最大值?如果可能,如何打印具有此最大字段总和的个人的第一个字段(姓名)?

即显示:Logan 877并将其存储到变量中。

答案1

你可以做:

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,其中包含从第二个添加的字段值开始的字段值

  • 最后(ENDfor(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

答案2

使用 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

相关内容