如何在shell脚本中获取数据集表内数值的最大值与最小值
优化后的极简实现
你原有的写法存在两个可优化点:硬编码min=999在目标列最小值小于999时会返回错误结果,拼接shell变量$i的写法容易引发语法问题,推荐用-v参数把shell变量传入awk,更规范也更简洁:
单求最小值的写法
min=$(awk -F',' -v col="$i" 'NR>1{min=NR==2?$col:(min<$col?min:$col)} END{print min}' "$filename")
如果可读性优先,也可以拆成更易维护的版本:
min=$(awk -F',' -v col="$i" ' NR==2 {min=$col} NR>2 {if($col < min) min=$col} END {print min}' "$filename")
同时求最大最小值(仅遍历一次文件,性能最优)
如果同时需要最大值,不用跑两次awk,单次遍历即可完成:
# 执行后直接把值读入shell的min、max变量 read min max <<< $(awk -F',' -v col="$i" ' NR==2 {min=max=$col} NR>2 { min = $col < min ? $col : min max = $col > max ? $col : max } END {print min, max}' "$filename")
小文件可选的管道写法
如果处理的是小体积CSV,也可以用sort组合命令实现,写法更直白:
# 最小值 min=$(tail -n +2 "$filename" | cut -d',' -f "$i" | sort -n | head -n1) # 最大值 max=$(tail -n +2 "$filename" | cut -d',' -f "$i" | sort -n | tail -n1)
内容的提问来源于stack exchange,提问作者ojihane
相关产品推荐
相关产品推荐

