我有一个 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'
在我继续之前,我必须提一下:使用https://www.shellcheck.net/ - 它会使调试 shell 脚本变得更加容易,这是我用来回答您的问题的工具之一。现在进入实际问题。
如果您查看错误输出,您会在这里错过双引号:
出于完全相同的原因-大量引号和printf 的可移植性-我建议改用
printf
命令:除其他事项外,请对 shell 变量进行双引号。如果变量包含空格,则会发生所谓的分词并产生意想不到的结果,从而破坏您的脚本。还有其他安全问题。
另一件事 - 在将文本附加到变量时使用简单的赋值和花括号:
使用花括号的原因是:如果没有它们,shell 可能会在变量名结束和纯文本开始的地方产生歧义。当然,带引号的原始形式
.parsed.txt
也很好,但花括号通常更好更清晰。代码还有其他问题,但我会留给您通过 shellcheck 进行审查。
请注意:我不隶属于 shellcheck.net - 我只是推荐一个我和其他 Linux 用户使用的好工具,并且可以很好地调试脚本