我有一个 bash 脚本,用于从 .vcf 文件中提取一些信息。如何更改此脚本,使其能够同时处理多个 .vcf 文件,并为每个文件返回单独的 .txt 输出?
这是我的脚本
#!/usr/bash
#outfilename
outname=$(echo $1".parsed.txt")
#Header for output file
echo -e "Chrom"'\t'"Position"'\t'"Ref"'\t'"Alt"'\t'"TumorReadCount"'\t'"TumorVariantAlleleCount"'\t'"TumorReferenceAlleleCount"'\t'"NormalReadCount"'\t'"NormalVariantAlleleCount"'\t'"NormalReferenceAlleleCount"'\t'"VAF" > $outname
while read -r line ;
do;
#Basic information
chrom=$(echo $line | sed 's/ /\t/g' | cut -f 1) #&& echo $chrom;
Pos=$(echo $line | sed 's/ /\t/g' | cut -f 2) #&& echo $Pos;
Ref=$(echo $line | sed 's/ /\t/g' | cut -f 4)
Alt=$(echo $line | sed 's/ /\t/g' | cut -f 5)
#Tumor sample read, variant and reference information
ReadCount=$(echo $line | cut -f 8 | sed 's/;/\t/g' | cut -f 13 | sed 's/ReadCount=//' )
VariantAlleleCount=$(echo $line | cut -f 8 | sed 's/;/\t/g' | cut -f 26| sed 's/VariantAlleleCount=//')
ReferenceAlleleCount=$(echo $ line | awk -v rc=$ReadCount -v vac=$VariantAlleleCount '{print rc-vac}')
#Control or Normal read, variant, reference information
ReadCountControl=$(echo $line | cut -f 8 | sed 's/;/\t/g' | cut -f 14 | sed 's/ReadCountControl=//')
VariantAlleleCountControl=$(echo $line | cut -f 8 | sed 's/;/\t/g' | cut -f 27 | sed 's/VariantAlleleCountControl=//')
ReferenceAlleleCountControl=$(echo $line | awk -v rcc=$ReadCountControl -v vacc=$VariantAlleleCountControl '{print rcc-vacc}')
VAF=$(echo $line | cut -f 8 | sed 's/;/\t/g' | cut -f 28 | sed 's/VariantAlleleFrequency=//')
#Print output
echo -e $chrom'\t'$Pos'\t'$Ref'\t'$Alt'\t'$ReadCount'\t'$VariantAlleleCount'\t'$ReferenceAlleleCount'\t'$ReadCountControl'\t'$VariantAlleleCountControl'\t'$ReferenceAlleleCountControl'\t'$VAF >> $outname ;
#Remove info tags from VCF
done; < <( egrep -v '#' $1)
当我添加for f in *.vcf
回报时
[fi1d18@cyan01 snp]$ bash vcf_parasing.sh
vcf_parasing.sh: line 7: syntax error near unexpected token `echo'
vcf_parasing.sh: line 7: `echo -e "Chrom"'\t'"Position"'\t'"Ref"'\t'dCount"'\t'"TumorVariantAlleleCount"'\t'"TumorReferenceAlleleCount"'\t'"NormalRelVariantAlleleCount"'\t'"NormalReferenceAlleleCount"'\t'"VAF" > $outname'
答案1
在继续之前,我必须提一下:使用https://www.shellcheck.net/- 它将使调试 shell 脚本变得更容易,这是我用来回答你的问题的工具之一。现在来谈谈实际问题。
如果你查看错误输出,你会发现这里漏掉了一个双引号:
"Ref"'\t'dCount"'
出于同样的原因——大量的引用和printf 的可移植性- 我建议使用printf
命令:
printf "Chrom\tPosition\tRef\tAlt\tTumorReadCount\tTumorVariantAlleleCount\tTumorReferenceAlleleCount\tNormalReadCount\tNormalVariantAlleleCount\tNormalReferenceAlleleCount\tVAF\n"
除其他事项外,请用双引号括住 shell 变量。如果变量包含空格,则会发生所谓的分词并产生意外结果,从而破坏您的脚本。还有其他安全问题也一样。
另一件事 - 将文本附加到变量时使用简单的赋值和花括号:
outname="${1}.parsed.txt"
使用花括号的原因是:如果没有花括号,shell 可能会搞不清楚变量名在哪里结束,纯文本在哪里开始。当然,使用引号括起来的原始格式.parsed.txt
也可以,但花括号通常更好、更清晰。
代码中还有其他问题,但我将留给您通过 shellcheck 进行检查。
请注意:我与 shellcheck.net 没有任何关系 - 我只是推荐一个我和其他 Linux 用户使用过的、可以很好地调试脚本的好工具