给定一个文本文件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
,其中包含从第二个添加的字段值开始的字段值最后(
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
答案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