如何将提取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
相关产品推荐
相关产品推荐

