#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