将 bash 脚本一起更改为所有文件

Ang*_*gel 2 bash scripts

我有一个 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)
Run Code Online (Sandbox Code Playgroud)

当我添加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'
Run Code Online (Sandbox Code Playgroud)

Ser*_*nyy 7

在我继续之前,我不得不提一下:使用https://www.shellcheck.net/ - 它将使调试 shell 脚本变得更加容易,这是我用来回答您的问题的工具之一。现在进入实际问题。

如果您查看错误输出,就会发现这里遗漏了一个双引号:

"Ref"'\t'dCount"'
Run Code Online (Sandbox Code Playgroud)

出于完全相同的原因——大量的引号和printf 的可移植性——我建议改用printf命令:

printf "Chrom\tPosition\tRef\tAlt\tTumorReadCount\tTumorVariantAlleleCount\tTumorReferenceAlleleCount\tNormalReadCount\tNormalVariantAlleleCount\tNormalReferenceAlleleCount\tVAF\n"
Run Code Online (Sandbox Code Playgroud)

除其他外,请双引号 shell 变量。如果变量包含空格,则会发生称为分词的事情并产生意想不到的结果,从而破坏您的脚本。还有其他安全问题

另一件事 - 在将文本附加到变量时使用简单的赋值和花括号:

outname="${1}.parsed.txt"
Run Code Online (Sandbox Code Playgroud)

使用花括号的原因是:如果没有它们,变量名结束和纯文本开始的 shell 可能不明确。当然,带引号的原始形式.parsed.txt也很好,但花括号通常更好更清晰。

代码还有其他问题,但我会让您通过 shellcheck 来查看它们。

请注意:我不隶属于 shellcheck.net - 我只是推荐一个我和其他 Linux 用户使用的好工具,它在调试脚本方面做得很好