Shell循环处理GWAS线性回归文件筛选ADD行无输出问题咨询
问题定位与修复方案
核心问题梳理
- 输出路径问题
PBS调度作业的默认工作目录为提交作业时的用户家目录,你脚本中未指定输出文件的存储路径,所有生成的${tox}_resid_ADD文件都被写入了PBS默认工作目录,而非原始GWAS结果文件所在的目录,因此你在原始数据路径下找不到生成的文件。 - 标识段提取规则缺陷
你使用${tox%%_*}截取标识段,当标识段本身包含下划线时(比如执行日志里的Induration_G2),会从第一个下划线处截断,最终得到错误的标识Induration而非正确的Induration_G2。 - 路径拼写不一致
脚本中写的遍历路径是/scrat/genome/hj86/Late_Tox_GWAS/*_resid.glm.linear,但执行日志显示实际文件路径为/scratch/genomeqol/hkj7/Late_Tox_GWAS/,路径拼写错误也会导致预期外的执行结果。
修复后脚本
#!/bin/bash #PBS -N Late_Tox_regression_ADD #PBS -l walltime=01:00:00 #PBS -l nodes=1:ppn=8 #PBS -l vmem=16gb #PBS -m bea #PBS -M my email address set -x # 定义原始文件所在的工作目录,和执行日志的实际路径保持一致 work_dir="/scratch/genomeqol/hkj7/Late_Tox_GWAS" cd ${work_dir} || exit 1 # 切换到目标目录,切换失败直接退出避免错误输出 for fname in *_resid.glm.linear do # 修改标识段提取规则,兼容标识段本身带下划线的场景 tox="${fname#*.}" tox="${tox%_resid.glm.linear}" # 过滤结果直接输出到当前工作目录 awk 'NR==1 || $7 == "ADD"{print}' "${fname}" > "${tox}_resid_ADD" done
修复说明
- 执行前先切换到原始文件所在目录,输出文件也会生成在该目录下,无需再去其他路径查找结果
- 修改了标识段提取逻辑,从后缀方向截断固定的
_resid.glm.linear字符,可完整保留标识段内的下划线 - 统一使用执行日志显示的真实文件路径,避免拼写错误导致的文件读取失败
内容的提问来源于stack exchange,提问作者HKJ3
相关产品推荐
相关产品推荐

