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

Bash脚本处理CSV:输出指定国家行第二列最大值及对应第三列值

Bash脚本实现CSV指定国家数据最大值筛选

需求说明

需要完成的CSV处理逻辑如下:

  • 接收两个入参:第一个为目标CSV文件路径,第二个为待筛选的国家名称
  • 筛选出CSV中第一列完全匹配指定国家的所有行
  • 计算这些行第二列数值的最大值,优先输出该最大值
  • 逐行输出所有第二列等于该最大值的行对应的第三列(年份)内容

使用示例输入CSV:

Argentina,4.6,2016,some data
Argentina,4.2,2018,some data
Argentina,4.6,1998,some data
Argentina,4.5,2001,some data

对应期望输出:

4.6
2016
1998

原有代码问题

你之前写的代码存在几个明显缺陷:

  • 匹配逻辑不准确:grep "$2*"的正则写法有误,既没有限定匹配第一列,还会匹配到国家名前缀相似、或者其他列包含国家名的无关行
  • 缺少最大值判断逻辑:排序后直接提取第三列,会输出所有行的第三列内容,无法筛选出等于最大值的记录
  • 生成了不必要的中间临时文件,存在冗余IO

可行实现方案

直接用awk单命令即可完成全部处理逻辑,不需要生成中间文件,匹配精度和执行效率都更高,完整脚本如下:

#!/bin/bash
# 基础参数校验
if [ $# -ne 2 ]; then
    echo "使用方式: $0 <CSV文件路径> <目标国家名>"
    exit 1
fi

awk -F',' -v country="$2" '
# 遍历每行时筛选第一列匹配目标国家的记录
$1 == country {
    # 实时更新第二列的最大值
    if (!max || $2 > max) {
        max = $2
    }
    # 缓存匹配行的第二列值和对应第三列年份
    col2[NR] = $2
    col3[NR] = $3
}
# 所有行处理完成后输出结果
END {
    print max
    for (i in col2) {
        if (col2[i] == max) {
            print col3[i]
        }
    }
}
' "$1"

实现说明

  • 通过-F','指定逗号为分隔符,通过-v把shell传入的国家名参数传递给awk内部变量,避免注入风险
  • 第一遍遍历就完成最大值计算和数据缓存,不需要排序操作,处理大文件时速度更快
  • 严格匹配第一列字段,不会出现误匹配
  • 自动输出所有和最大值对应的年份,不管有多少条同值记录都能正确输出

内容的提问来源于stack exchange,提问作者AstralV

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 18:51:48