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

如何将提取CSV最小dG值的AWK脚本接入批量处理的bash函数?

可以直接将你写的单行AWK脚本通过管道接入原有流程,同时修正单行AWK的行号判断错误(原逻辑NR>3会漏掉第3行数据的最小值比较,要改成NR>2),再补充表头写入逻辑即可,修改后的完整rescore_data2函数如下:

home="$PWD"
# 输出结果存放文件夹
rescore="${home}"/rescore 
# 待分析数据存放文件夹
storage="${home}"/results_bench
cd "${storage}"
# 各子目录下待处理CSV的文件名匹配规则
str='*str1.csv'

rescore_data2 () {
    str_name=$(basename "${str}" .csv)
    printf >&2 'Dataset for %s is being rescored...  ' "${str_name}"; sleep 0.1 
    mkdir -p "${rescore}/${str_name}"
    # 提取前缀用于表头
    prefix=$(find . -maxdepth 1 -type d -name '*_*_*' | head -n1 | awk -F'_' '{print $1}')
    # 目标输出文件路径
    output_file="${rescore}/${str_name}/${prefix}.csv"
    # 先写入表头
    echo "name: ${prefix}, dG(min)" > "${output_file}"
    
    # 批量处理每个子目录
    while read -r d; do
        # 原有AWK计算重打分结果 + 管道接入最小值计算AWK
        awk -F', *' -v OFS=', ' '
        FNR==1 {
            path=FILENAME
            sub(/\/[^/]+$/,"",path)
            prefix=suffix=FILENAME
            sub(/_.*/, "", prefix)
            sub(/\/[^\/]+$/, "", suffix); sub(/^.*_/, "", suffix)
            print suffix,"dG(rescored)"
            next
        }
        {
            print $1, sqrt((($3+12)/12)^2+(($2-240)/240)^2)
        }
        '  "${d}_"*/${str} | awk -F ', ' '
            NR==1 { coltitle=$1 } 
            NR==2 { min=$2; id=$1 } 
            NR>2 && $2<min { min=$2; id=$1 } 
            END { print coltitle FS min" ("id")" }
        ' >> "${output_file}"
    done < <(find . -maxdepth 1 -type d -name '*_*_*' | awk -F '[_/]' '!seen[$2]++ {print $2}')
}

核心修改说明

  • 修正了单行AWK的行号判断逻辑,避免漏掉第二条数据行的最小值比较
  • 提前提取统一前缀写入表头,符合要求的顶部表头格式
  • 把原有单文件输出改为追加写入汇总文件,最终汇总文件内的行数=处理的CSV数量+1行表头,和预期输出结构完全匹配
  • 新增mkdir -p参数避免重复创建目录时报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 15:15:06