【问题标题】:Need help, can't see the mistake [closed]需要帮助,看不到错误[关闭]
【发布时间】:2021-07-15 13:52:44
【问题描述】:

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

$ 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

有人看出错误了吗?

【问题讨论】:

  • 欢迎来到 SO,请在您的问题中分享输入和预期输出示例,以使您的问题更清楚,谢谢。

标签: sed grep cut cat


【解决方案1】:

Bash 有一个特殊的语法(进程替换)&lt;(command)&lt;( 之间没有空格。 删除这些空格。
加上一些换行符:

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}"

现在您想删除重复的代码,但如果没有示例输入和输出文件,您还不清楚您想要什么。在包含以ID=(digits) 开头的所有注释字段的原始代码“Chr”中,第二个和第三个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}"

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2011-09-15
  • 2021-11-12
  • 2014-09-22
  • 2014-08-31
  • 2018-02-15
  • 2012-07-12
相关资源
最近更新 更多