借助Slurm数组任务为VCF文件生成含样本名与Pos值的ID列
解决VCF文件添加样本名与Pos拼接ID列的问题
需求说明
原制表符分隔的VCF文件初始列为Chrom、Pos,需调整为Chrom、ID、Pos三列,其中ID格式为样本名_Pos值;136个样本名存储于IDs.txt,通过Slurm数组任务按ID提取对应样本名。
修正后的Slurm+Awk解决方案
调整Slurm脚本,将提取到的样本名传递给Awk,实现ID列的拼接与插入:
#!/bin/bash --login #SBATCH --array=1-136 EXOME_IDs_FILE=/home/IDs.txt # 获取当前数组任务对应的样本名 SAMPLE_NAME=$(sed -n "${SLURM_ARRAY_TASK_ID}p" "$EXOME_IDs_FILE") # 处理VCF文件,生成带样本名后缀的新文件(避免批量任务覆盖) awk -v sample="$SAMPLE_NAME" 'BEGIN{FS=OFS="\t"} # 处理表头行 NR==1 { print $1, "sample_variantpos_ID", $2 } # 处理数据行,拼接样本名与Pos值作为ID NR>1 { print $1, sample "_" $2, $2 }' original_file.vcf > "${SAMPLE_NAME}_modified.vcf"
关键说明
- 传递样本名到Awk:通过
-v sample="$SAMPLE_NAME"将Bash变量传入Awk,解决之前无法获取样本名的问题 - 表头处理:直接输出调整后的三列表头
- 数据行拼接:用
sample "_" $2实现样本名与Pos列($2)的拼接,生成符合要求的ID - 避免文件覆盖:输出文件添加样本名后缀,适合Slurm批量任务场景
可选:直接修改原文件(不推荐)
如果需要直接覆盖原VCF文件,可使用临时文件中转:
#!/bin/bash --login #SBATCH --array=1-136 EXOME_IDs_FILE=/home/IDs.txt SAMPLE_NAME=$(sed -n "${SLURM_ARRAY_TASK_ID}p" "$EXOME_IDs_FILE") awk -v sample="$SAMPLE_NAME" 'BEGIN{FS=OFS="\t"} NR==1 { $1 = $1 OFS "sample_variantpos_ID" } NR>1 { $1 = $1 OFS sample "_" $2 }1' file.vcf > tmp && mv tmp file.vcf
内容的提问来源于stack exchange,提问作者Amy Houseman
相关产品推荐
相关产品推荐

