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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:20:19