首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在将bash转换为shell脚本语法错误时,我遇到了一个错误

在将bash转换为shell脚本语法错误时,我遇到了一个错误
EN

Stack Overflow用户
提问于 2021-12-09 09:30:25
回答 2查看 63关注 0票数 -1
代码语言:javascript
复制
#!/bin/bash

set -o errexit
set -o nounset

#VAF_and_IGV_TAG

paste <(grep -v "^#" output/"$1"/"$1"_Variant_Filtering/"$1"_GATK_filtered.vcf | cut -f-5) \
      <(grep -v "^#" output/"$1"/"$1"_Variant_Filtering/"$1"_GATK_filtered.vcf | cut -f10-| cut -d ":" -f2,3) |
sed 's/:/\t/g' |
sed '1i chr\tstart\tend\tref\talt\tNormal_DP_VCF\tTumor_DP_VCF\tDP'|
awk 'BEGIN{FS=OFS="\t"}{sub(/,/,"\t",$6);print}' \
  > output/"$1"/"$1"_Variant_Annotation/"$1"_VAF.tsv

如果我没有使用变量在终端中运行这个代码,那么上面的代码最后会出现语法错误,它不会显示语法错误。

sh Test.sh S1 Test.sh: 6: Test.sh:语法错误:“(意外的

代码语言:javascript
复制
paste <(grep -v "^#" output/S1/S1_Variant_Filtering/S1_GATK_filtered.vcf | cut -f-5) \
      <(grep -v "^#" output/S1/S1_Variant_Filtering/S1_GATK_filtered.vcf | cut -f10-| cut -d ":" -f2,3) |
sed 's/:/\t/g' |
sed '1i chr\tstart\tend\tref\talt\tNormal_DP_VCF\tTumor_DP_VCF\tDP'|
awk 'BEGIN{FS=OFS="\t"}{sub(/,/,"\t",$6);print}' \
  > output/S1/S1_Variant_Annotation/S1_VAF.ts

我的vcf文件如下所示:https://drive.google.com/file/d/1HaGx1-3o1VLCrL8fV0swqZTviWpBTGds/view?usp=sharing

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-09 10:31:21

sh不支持bash进程替换<()。移植它的最简单的方法是写出两个临时文件,并在完成时通过陷阱删除它们。更好的选择是使用功能足够强大的工具(即sed)来完成所需的筛选和操作:

代码语言:javascript
复制
#!/bin/sh
header="chr\tstart\tend\tref\talt\tNormal_DP_VCF\tTumor_DP_VCF\tDP"
field_1_to_5='\(\([^\t]*\t\)\{5\}\)' # \1 to \2
field_6_to_8='\([^\t]*\t\)\{4\}[^:]*:\([^,]*\),\([^:]*\):\([^:]*\).*' # \3 to \6
src="output/${1}/${1}_Variant_Filtering/${1}_GATK_filtered.vcf"
dst="output/${1}/${1}_Variant_Variant_Annotation/${1}_VAF.tsv"
sed -n \
  -e '1i '"$header" \
  -e '/^#/!s/'"${field_1_to_5}${field_6_to_8}"'/\1\4\t\5\t\6/p' \
  "$src" > "$dst"

如果使用awk (或perl、python等),只需将脚本移植到该语言即可。

顺便说一句,所有这些重复的$1都建议您重新修改您的文件命名标准。

票数 1
EN

Stack Overflow用户

发布于 2021-12-09 09:58:05

如果要在<(command)下运行此代码,则不能使用sh进程替换。不幸的是,没有一种优雅的方法可以避免临时文件(或者更可怕的文件),但是您的paste命令--实际上是整个管道--似乎相当容易将其重构为Awk脚本。

代码语言:javascript
复制
#!/bin/sh

set -eu

awk -F '\t' 'BEGIN { OFS=FS;
        print "chr\tstart\tend\tref\talt\tNormal_DP_VCF\tTumor_DP_VCF\tDP' }
    !/#/ { p=$0; sub(/^([^\t]*\t){9}/, "", p);
           sub(/^[:]*:/, "", p); sub(/:.*/, "", p);
           sub(/,/, "\t", p);
           s = sprintf("%s\t%s\t%s\t%s\t%s\t%s", $1, $2, $3, $4, $5, p);
           gsub(/:/, "\t", s);
           print s
    }' output/"$1"/"$1"_Variant_Filtering/"$1"_GATK_filtered.vcf \
  > output/"$1"/"$1"_Variant_Annotation/"$1"_VAF.tsv

如果没有对VCF文件的访问,我就无法测试这个文件,但至少它应该为如何继续进行提供一个总体方向。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70287492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档