多くのファイルのスクリプトを自動的に生成

多くのファイルのスクリプトを自動的に生成

私はこれを見つけるのに苦労しています。フィルタリングする必要がある遺伝学ファイルがあります。クラスタが設定されているため、VCFのすべてのファイル/サンプルをフィルタリングする前にタイムアウトします。したがって、これを正しく実行するには、1,250に近いスクリプトを手動で作成する必要がありました。明らかにメモ帳++にコピーして貼り付け、手動で変更して正しい染色体を得ることは可能ですが、一日中机に座ってCTRL-C、CTRL-H、CTRL-Sだけを使用したくありません。基本スクリプトをインポートして必要なものを修正し、新しいファイルに保存できるように、このタスクを自動化したいと思います。基本的なことはわかっていますが、それらをまとめてコンパイルする方法がわからず、Googleは私をどこにも案内しません。

私のファイルは次のとおりです。

    #!/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"

関連情報