Выполнить анализ для файлов во всех подкаталогах и сохранить выходные данные в каждом подкаталоге?

#bash #vcf-variant-call-format

#bash #vcf-variant-call-format

Вопрос:

В родительском каталоге у меня есть несколько подкаталогов, каждый из которых содержит один.vcf.gz файл, по которому должен быть выполнен анализ. Я хочу выполнить следующие команды для всех.vcf.gz файлы во всех подкаталогах. Я попытался с помощью следующего кода, но результирующий файл не сохраняется в соответствующем подкаталоге. Он сохраняется в главном каталоге и каждый раз перезаписывается следующим.

     find . -type f -name '*.vcf'      

   -exec vcftools --gzvcf {} --minGQ 20 --recode --out GENO_FILT_GQ20 ';'   

   -exec vcftools --vcf GENO_FILT_GQ20.recode.vcf --max-missing 0.7 --out filtered  ';'

   -exec vcftools --vcf GENO_FILT_GQ20.recode.vcf --min-alleles 2 --max-alleles 2  ';'

   -exec /home/bioinformatics/Dokumente/pipeline_test/annovar/convert2annovar.pl 
    -format vcf4 GENO_FILT_GQ20.recode.vcf 
    -outfile ALL_genepy.input 
    -allsample 
    -withfreq 
    -include 2>annovar.log ';'

   -exec /home/bioinformatics/Dokumente/pipeline_test/annovar/table_annovar.pl 
        ALL_genepy.input 
        /home/bioinformatics/Dokumente/pipeline_test/annovar/humandb/ 
        -buildver hg19 
        -out ALL_genepy 
        -remove 
        -protocol refGene,gnomad_exome,cadd13,eigen,revel,gwava,dann 
        -operation g,f,f,f,f,f,f 
        --thread 40 
        --maxgenethread 40 
        -nastring . >>annovar.log';'

    -exec cut -f 18- ALL_genepy.input > a1';'

    -exec zgrep '^#CHR' GENO_FILT_GQ20.recode.vcf | cut -f 10- > b1';'

    -exec cat b1 a1 > ALL_temp';'

    -exec paste ALL_genepy.hg19_multianno.txt ALL_temp > ALL_genepy.meta';'

    -exec rm a1 b1 ALL_temp #remove';'

    -exec mkdir CADD13_RawScore Eigen GWAVA_region_score GWAVA_tss_score dann REVEL ';'

    -exec grep "^Chr" ALL_genepy.meta> header ';'

    -exec chmod  x GENEPY_1.2.sh ';'

    -exec while read gene; do

  sh GENEPY_1.2.sh $gene
done < gene.list ';'
done
  

Комментарии:

1. Это нечитаемо.

Ответ №1:

exec Запускает команду, она не «поддерживает синтаксис» и не является специальной. Если вы напишете:

 find blabla -exec blabla 2>something ';' -exec blabla >something ';'
  

Перенаправления обрабатываются оболочкой, а не с помощью find . Это то же самое, что:

 find blabla -exec blabla ';' -exec blabla  ';' 2>something >something
                                               ^^^^^^^^^^^^^^^^^^^^^^ - redirections
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - the command with argumnets
  

Отбросьте все exec и просто выполните цикл while:

 find blabla |
while IFS= read -r f; do
    : use "$f" here
done
  

Читать https://mywiki .wooledge.org/BashFAQ/001 и проверьте свои сценарии с помощью http://shellcheck.net