【问题标题】:Replace hash sign using awk command [closed]使用 awk 命令替换井号 [关闭]
【发布时间】:2021-06-25 21:04:04
【问题描述】:

我有一个file.vcf,其中包含以下几行。我想用 awk 命令替换我文件中的#(请注意单个#)。

##contig=<ID=23,length=155698556>
##INFO=<ID=PR,Number=0,Type=Flag,Description="Provisional reference allele, may not be based on real reference genome">
##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
#CHROM  POS     ID      REF     ALT

我尝试了awk '/^#CHROM/{sub(/^#/,"")}​ 1' file.vcf,但它会在下面生成以下错误。我在这里错过了什么?

awk: cmd. line:1: /^#CHROM/{sub$(/^#/,"")}​ 1
awk: cmd. line:1:              ^ syntax error
awk: cmd. line:1: /^#CHROM/{sub$(/^#/,"")}​ 1
awk: cmd. line:1:                    ^ syntax error
awk: cmd. line:1: /^#CHROM/{sub$(/^#/,"")}​ 1
awk: cmd. line:1:                        ^ invalid char '▒' in expression

我想要的结果:

    ##contig=<ID=23,length=155698556>
    ##INFO=<ID=PR,Number=0,Type=Flag,Description="Provisional reference allele, may not be based on real reference genome">
    ##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
    CHROM  POS     ID      REF     ALT

【问题讨论】:

  • 为什么sub后面有$
  • 为什么要使用awksed 's/^#CHROM/CHROM/' file.vcf
  • 错误信息不是很清楚吗?它告诉你$ 是一个语法错误。
  • asub() 的第二个参数中是否代表一个空字符串,因为它是一个未分配的变量?如果是这样 - 不要那样做,它只会让你的代码更难理解,绝对没有理由。如果你想要一个空字符串,那么写一个空字符串,""
  • @MAPK 我看到你很快就接受了你得到的第一个答案。这将阻止其他人提供答案,因此如果您知道您得到的第一个答案是最好的答案,这只是一个明智的举动。一切顺利,

标签: linux bash shell awk


【解决方案1】:

awk '{ $1 ~ "#CHROM" sub("#", ""); print }' file.vcf 为我工作。语法意味着如果 ($1) 行的第一个单词与 (~) 单词“#CHROM”匹配,则将该行上的“#”替换为“”,然后打印该行。

【讨论】:

  • 该命令不符合您的描述。它将 $1 与 "#CHROM" 的串联和 sub("#", "") 的 0 或 1 结果进行比较,然后丢弃该比较的结果,因为 a) 您将 $1 与 #CHROM0 或 @ 进行比较987654325@,两者都不存在,b) 你在连接之前删除了#,所以 $1 是CHROM,而不是#CHROM。然后它无条件地打印当前行。当正则表达式常量更有意义和更有效时,它也使用动态正则表达式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-11
  • 1970-01-01
  • 1970-01-01
  • 2017-11-17
  • 1970-01-01
  • 2014-10-03
  • 2014-07-06
相关资源
最近更新 更多