如何正确匹配同后缀_filteredSNPs.txt文件解决plink调用报错
问题说明
你现有15个命名格式为[个体名]_filteredSNPs.txt的输入文件,需要批量运行plink的clump分析,要求输出文件以对应个体名为前缀,统一加_clumped后缀。当前运行脚本时报错无法打开输入文件。
排查步骤
首先解决「正确列出所有目标文件」的需求,同时定位报错原因:
- 进入工作目录后执行通配符查询,直接列出所有符合后缀规则的文件:
cd /data/PRS ls *_filteredSNPs.txt
执行后如果能返回15个文件路径,说明文件都在当前目录;如果返回数量不对,说明文件存储路径和脚本里的cd路径不一致,先把所有输入文件移到/data/PRS目录下再跑。
- 提取所有个体名列表,确认和PBS数组的ID对应关系:
# 提取所有文件名里的个体名部分,输出到列表文件 ls *_filteredSNPs.txt | sed 's/_filteredSNPs.txt//' > sample_list.txt # 统计个体数量,确认返回值为15 wc -l sample_list.txt
脚本修正方案
核心报错原因:你直接把$PBS_ARRAYID当个体名用,只有当个体名是和数组ID完全一致的连续数字(比如1到15)时这个写法才成立,如果个体名是字符串编号、或者数组ID范围没覆盖所有样本,就会找不到文件。根据你的个体名格式二选一即可:
方案1:个体名是1-15的连续数字
提交PBS任务时指定数组范围为1-15,脚本里增加文件存在校验,避免空跑:
#!/bin/bash #PBS -t 1-15 # 数组ID对应15个样本序号 cd /data/PRS/ i=$PBS_ARRAYID file="${i}_filteredSNPs.txt" out="${i}_clumped" # 校验输入文件存在,不存在直接报错退出 if [ ! -f "$file" ]; then echo "Error: 输入文件 $file 不存在,请检查文件名和路径" exit 1 fi ./plink \ --bfile filesforPRS \ --clump-p1 1 \ --clump-r2 0.1 \ --clump-kb 250 \ --clump "$file" \ --clump-snp-field ID \ --clump-field P \ --out "$out"
方案2:个体名是非数字的样本编号
用之前生成的sample_list.txt按数组ID取对应个体名,不需要手动匹配ID和样本名:
#!/bin/bash #PBS -t 1-15 # 数组ID对应sample_list.txt的行号 cd /data/PRS/ # 读取当前数组ID对应行的个体名 i=$(sed -n "${PBS_ARRAYID}p" sample_list.txt) file="${i}_filteredSNPs.txt" out="${i}_clumped" if [ ! -f "$file" ]; then echo "Error: 输入文件 $file 不存在,请检查文件名和路径" exit 1 fi ./plink \ --bfile filesforPRS \ --clump-p1 1 \ --clump-r2 0.1 \ --clump-kb 250 \ --clump "$file" \ --clump-snp-field ID \ --clump-field P \ --out "$out"
注意事项
- 提交数组任务前,先手动选一个个体名替换脚本里的
$i,单跑一次命令确认plink能正常读取输入、bfile文件路径正确,没有参数错误再批量提交 - 提前确认
filesforPRS.bed、filesforPRS.bim、filesforPRS.fam三个文件都在/data/PRS目录下,否则plink会报bfile相关的文件找不到错误。
内容的提问来源于stack exchange,提问作者AvniKaur
相关产品推荐
相关产品推荐

