如何用awk打印所有最大值?现有代码仅输出单个结果需修正
如何用awk打印所有薪资最大值的记录
需求说明
给定如下输入数据(薪资末尾带有.):
name1 job1 9500. name2 job2 9500. name3 job3 4500.
需要输出所有薪资为最大值的记录,格式如下:
job: job1, sal: 9500 job: job2, sal: 9500
原有代码问题
你当前的awk代码仅输出最后一条最大值记录:
BEGIN {a=0} {if ($3> a) max=$3; output=$2 } END{ print "job: ", output, "sal:", max}
问题点:
- 单个
output变量会被每次循环覆盖,最终只保留最后一行的职位信息 if语句的范围错误,只有max=$3在条件判断内,output=$2每次都会执行- 未处理薪资等于最大值的情况,也未收集所有符合条件的条目
- 直接使用带
.的$3进行数值比较,可能导致逻辑误差
修正方案
方案1:两次遍历(直观易读)
第一次遍历找出最大薪资,第二次遍历筛选并打印所有符合条件的记录:
# 第一次遍历:确定最大薪资值 NR == FNR { # 去除薪资末尾的点,转为数值 sal = substr($3, 1, length($3)-1) + 0 if (sal > max) max = sal next } # 第二次遍历:输出所有薪资等于最大值的记录 { sal = substr($3, 1, length($3)-1) + 0 if (sal == max) { printf "job: %s, sal: %d\n", $2, sal } }
使用命令:
awk 'NR==FNR{sal=substr($3,1,length($3)-1)+0;if(sal>max)max=sal;next}{sal=substr($3,1,length($3)-1)+0;if(sal==max)printf "job: %s, sal: %d\n",$2,sal}' input.txt input.txt
方案2:一次遍历(高效)
在单次遍历中动态维护最大值及对应的职位列表:
BEGIN { max = 0 } { # 处理薪资,去除末尾的点 sal = substr($3, 1, length($3)-1) + 0 if (sal > max) { # 找到更大值,重置存储并更新最大值 max = sal delete jobs count = 0 jobs[++count] = $2 } else if (sal == max) { # 等于当前最大值,添加到列表 jobs[++count] = $2 } } END { # 遍历输出所有符合条件的记录 for (i=1; i<=count; i++) { printf "job: %s, sal: %d\n", jobs[i], max } }
使用命令:
awk 'BEGIN{max=0}{sal=substr($3,1,length($3)-1)+0;if(sal>max){max=sal;delete jobs;count=0;jobs[++count]=$2}else if(sal==max){jobs[++count]=$2}}END{for(i=1;i<=count;i++)printf "job: %s, sal: %d\n",jobs[i],max}' input.txt
内容的提问来源于stack exchange,提问作者wannabe
相关产品推荐
相关产品推荐

