首页 > 解决方案 > 需要帮助,看不到错误

问题描述

我的工作是根据论文的规范遵循不同命令的管道。但是,有一个命令可以更改染色体名称。这个命令非常复杂,对我来说是一个真正的挑战。

$ cat < (head -50 Nipponbare_indel.vcf | grep ’#’ | sed ’s/ID=\([0-9][0-9]*\)/ID=Chr\1/g’ | cut -f1-8) < (grep -v ’#’ Nipponbare_indel.vcf | cut -f1-8 | sed ‘s/^\([0-9]*\)/Chr\1/g’) < (grep -v ’#’ NB_final_snp.vcf | cut -f1-8 | sed ’s/^\([0-9]*\)/Chr\1/g’) > Nipponbare_indel_SNP.vcf

输出:'意外单词的语法错误('

echo $SHELL/bin/bash

有没有人看到错误?

标签: sedgrepcutcat

解决方案


Bash 有一个特殊的语法(进程替换) ,和<(command)之间没有空格。删除那些空格。 有一些换行符:<(

cat <(head -50 Nipponbare_indel.vcf | grep ’#’ | 
      sed ’s/ID=\([0-9][0-9]*\)/ID=Chr\1/g’ | cut -f1-8) \
    <(grep -v ’#’ Nipponbare_indel.vcf | cut -f1-8 | 
      sed ‘s/^\([0-9]*\)/Chr\1/g’) \
    <(grep -v ’#’ NB_final_snp.vcf | cut -f1-8 | 
      sed ’s/^\([0-9]*\)/Chr\1/g’) > Nipponbare_indel_SNP.vcf

在上面的命令中我没有修复错误的单引号。

实际上这里不需要使用进程替换,可以写

indel=Nipponbare_indel.vcf
snp=NB_final_snp.vcf
outfile=Nipponbare_indel_SNP.vcf

head -50 "${indel}" | grep ’#’ | 
   sed 's/ID=\([0-9][0-9]*\)/ID=Chr\1/g' | cut -f1-8 > "${outfile}"
grep -v '#' "${indel}" | cut -f1-8 | 
   sed 's/^\([0-9]*\)/Chr\1/g' >> "${outfile}"
grep -v '#' "${snp}" | cut -f1-8 | 
   sed 's/^\([0-9]*\)/Chr\1/g' >> "${outfile}"

现在您想删除重复的代码,但如果没有示例输入和输出文件,您还不清楚您想要什么。在包含所有以 like 开头的注释字段的原始代码“Chr”中ID=(digits),第二个和第三个sed是错误的:

sed 's/^\([0-9]*\)/Chr\1/g' inputfile

允许使用*0 个或多个数学,从而为所有非空行插入 Chr。全局标志/g无效,因为^它与行首匹配。
当您想Chr在该行的第一个数字序列之前插入时,您可以搜索第一个数字并使用

indel=Nipponbare_indel.vcf
snp=NB_final_snp.vcf
tmpfile=NB_parsing.tmp
outfile=Nipponbare_indel_SNP.vcf

head -50 "${indel}" | grep ’#’ > "${tmpfile}"
grep -v '#' "${indel}" >> "${tmpfile}"
grep -v '#' "${snp}" >> "${tmpfile}"
cut -f1-8 "${tmpfile}" | sed 's/[0-9]/Chr&/' >> "${outfile}"
rm "${tmpfile}"

推荐阅读