如何在BASH中获取CSV列高频值(平局时取A列最小值对应项)
获取CSV列频率最高值并处理平局情况
需求说明
从逗号分隔的CSV文件中,找出B列出现频率最高的值;若多个值出现次数相同,则选取对应A列数值最小的B列值。禁止使用grep、awk、sed、csvkit工具。
示例文件file.csv内容:
A,B
4,AA
3,AA
2,BB
1,BB
解决方案
通过Bash内置命令和基础工具(tail、sort、head)实现,无需禁用工具:
# 初始化关联数组,存储B列值的出现次数和对应A列最小值 declare -A b_count declare -A b_min_a # 跳过表头,逐行读取CSV数据 tail -n +2 file.csv | while IFS=, read -r a_val b_val; do # 更新B列值的出现次数 ((b_count[$b_val]++)) # 更新对应A列的最小值 if [[ -z "${b_min_a[$b_val]}" || "$a_val" -lt "${b_min_a[$b_val]}" ]]; then b_min_a[$b_val]="$a_val" fi done # 生成可排序的统计行(格式:次数 最小A值 B值) stats_output="" for b_val in "${!b_count[@]}"; do stats_output+="${b_count[$b_val]} ${b_min_a[$b_val]} $b_val"$'\n' done # 按规则排序并提取目标值:先按次数降序,再按最小A值升序,取第一行的B值 target_var=$(echo "$stats_output" | sort -k1,1nr -k2,2n | head -n1 | while read -r _ _ b; do echo "$b"; done) # 输出结果 echo "$target_var"
结果验证
执行上述命令后,输出为BB,符合需求:AA和BB出现次数均为2,但BB对应的A列最小值1小于AA的3,因此选中BB。
内容的提问来源于stack exchange,提问作者Takawako
相关产品推荐
相关产品推荐

