我有一个bash脚本,它接受参数,然后运行程序bcftools:
$infile = $1
$outfile = $2
$pop1 = $3
$pop2 = $4
我想使用pop1和pop2参数作为参数,因此在下面的命令中,AFR_AF
将由pop1
替换,而EUR_AF
将由pop2
替换:
bcftools view -i 'min(AFR_AF>0) & min(EUR_AF>0) & min(AFR_AF<1) & min(EUR_AF<1)' $infile > $outfile
但是,如果我使用与输入和输出文件相同的语法(例如$pop1
,我会收到错误,因为bcftools无法识别变量。如何使用命令行变量作为其他工具的参数?
这是我的脚本:
#!/bin/bash
outFolder=$1
pop1=$2
pop2=$3
arr=($(seq 1 22 && echo X && echo Y))
for i in "${arr[@]}"; do
bcftools view -i 'min("$pop1">0) & min("$pop2">0) & min("$pop1"<1) & min("$pop2"<1)' chr"$i".vcf.gz |
bcftools query -f '%CHROM\t%POS\t%REF\t%ALT\t%AA[\t%GT]\n' |
awk '{if(length($3)==1 && length($4)==1) print}' > $outFolder/"$i".txt; done
我用以下命令执行它:
./EHHparser1.sh EHH/ AFR_AF EUR_AF
并为每个循环重复此错误:
Wrong operator in string comparison: min("$pop1">0) & min("$pop2">0) & min("$pop1"<1) & min("$pop2"<1) [(null),$pop1]
我需要使用双引号而不是单引号,因为表达式不会在单引号中展开:
bcftools view -i "min($pop1>0) & min($pop2>0) & min($pop1<1) & min($pop2<1)" $infile > $outfile