You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 17:10:24