我很难解决这个问题。我有一些需要过滤的遗传学文件。由于我的集群设置方式,在我过滤 VCF 中的所有文件/样本之前就会超时。因此,这意味着我必须手动编写近 1,250 个脚本才能正确完成此操作。显然,在 Notepad++ 中复制粘贴并手动更改它们是可能获得正确的染色体的,但我不想坐在办公桌前一整天直接执行 CTRL-C、CTRL-H、CTRL-S。我想自动执行此操作,以便我可以获取基本脚本,修改我需要的内容,并将它们保存到新文件中。我已经掌握了基础知识,但我不知道如何将所有这些编译在一起,谷歌也没有给我带来任何帮助。
我的文件如下所示:
#!/bin/bash
#SBATCH stuff
cd /Where/My/Stuff/Is/
while read i; do
./bcftools view Chrom1.vcf --options-for-bcftools -S
/Where/My/Samples/Are/${i}_Samples.txt -o
/Where/I/Want/NewFile/To/Go/${i}_Chrom1.vcf; done < /Where/My/Samples/Are/FullSampleList.txt
我的想法以及我需要输入的内容是:
for x in {1..22}; do
cat Script1.sh
sed 's/./bcftools view Chrom${x}.vcf --options-for-bcftools -S /Where/My/Samples/Are/${i}_Samples.txt -o /Where/I/Want/NewFile/To/Go/${i}_Chrom1.vcf; done < /Where/My/Samples/Are/FullSampleList.txt Script1.sh > Script2.sh; done
我真的需要一些帮助。生成的脚本名称应为 Script[previousnumber+1].sh,因此文件名将以 1 为增量增加。一定有办法做到这一点,我无法想象如果人们有数百个需要提交的脚本来处理特定文件,他们会整天坐着复制粘贴。
答案1
我相信您正在寻找这样的东西:
#!/bin/bash
## Set the scriptHeader variable to hold the SBATCH commands you need
read -r -d '' scriptHeader <<EoF
#!/bin/bash
#SBATCH line 1
#SBATCH line 2
#SBATCH line 3
EoF
stuffPath=/Where/My/Stuff/Is
samplePath=/Where/My/Samples/Are
outputPath=/Where/I/Want/NewFile/To/Go
while read sampleName; do
for ((chr=1; chr<=22; chr++)); do
command="$stuffPath/bcftools view"
inVCF="$thisSamplePath/$chr.vcf"
thisSamplePath="$samplePath/${sampleName}_Samples.txt"
thisOutputPath="$outputPath/${sampleName}_Chrom${chr}.vcf"
printf '%s\n%s "%s" -S "%s" -o "%s"\n' "$scriptHeader" \
"$command" "$inVCF"\
"$thisSamplePath/$chr.vcf" \
"$thisOutputPath" > "$stuffPath/$sampleName.$chr.sh"
done
done < "$samplePath"/FullSampleList.txt
这将为 .txt 中的每一行生成 22 个文件"$samplePath"/FullSampleList.txt
。每个文件将如下所示:
#!/bin/bash
SBATCH line 1
SBATCH line 2
SBATCH line 3
/Where/My/Stuff/Is/bcftools view "/Where/My/Samples/Are/ACB_YRI_Samples.txt/6.vcf" -S "/Where/My/Samples/Are/ACB_YRI_Samples.txt/6.vcf" -o "/Where/I/Want/NewFile/To/Go/ACB_YRI_Chrom6.vcf"