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
相关产品推荐
相关产品推荐

