【问题标题】:sed & regex expressionsed & 正则表达式
【发布时间】:2018-11-11 16:42:20
【问题描述】:

我正在尝试在不存在的行中添加一个“chr”字符串。此操作仅在没有'##' 的行中是必需的。 起初我使用 grep + sed 命令,如下所示,但我想运行命令覆盖原始文件。

grep -v "^#" 5b110660bf55f80059c0ef52.vcf | grep -v 'chr' | sed 's/^/chr/g'

所以,要在文件中运行命令,我会这样写:

sed -i -E '/^#.*$|^chr.*$/ s/^/chr/' 5b110660bf55f80059c0ef52.vcf

这是vcf文件的内容。

##FORMAT=<ID=DP4,Number=4,Type=Integer,Description="#ref plus strand,#ref minus strand, #alt plus strand, #alt minus strand">
#CHROM  POS ID  REF ALT QUAL    FILTER  INFO    FORMAT  24430-0009S21_GM17-12140
1   955597  95692   G   T   1382    PASS    VARTYPE=1;BGN=0.00134309;ARL=150;DER=53;DEA=55;QR=40;QA=39;PBP=1091;PBM=300;TYPE=SNP;DBXREF=dbSNP:rs115173026,g1000:0.2825,esp5400:0.2755,ExAC:0.2290,clinvar:rs115173026,CLNSIG:2,CLNREVSTAT:mult,CLNSIGLAB:Benign;SGVEP=AGRN|+|NM_198576|1|c.45G>T|p.:(p.Pro15Pro)|synonymous GT:DP:AD:DP4    0/1:125:64,61:50,14,48,13
chr1    957898  82729935    G   T   1214    off_target  VARTYPE=1;BGN=0.00113362;ARL=149;DER=50;DEA=55;QR=38;QA=40;PBP=245;PBM=978;NVF=0.53;TYPE=SNP;DBXREF=dbSNP:rs2799064,g1000:0.3285;SGVEP=AGRN|+|NM_198576|2|c.463+56G>T|.|intronic    GT:DP:AD:DP4    0/1:98:47,51:9,38,10,41

【问题讨论】:

  • 发布预期结果
  • 与其尝试匹配不存在的内容,不如匹配存在的内容?例如,所有不以#chr 开头的行是否已经总是以数字开头?在这种情况下,您可以编写如下内容:sed -i "s/^\([0-9]\)/chr\1/" blah-blah.vcf
  • @lurker 你是对的:它有效!非常感谢!

标签: regex shell unix sed vcf-variant-call-format


【解决方案1】:

如果我了解您的预期结果,请尝试:

sed -ri '/^(#|chr)/! s/^/chr/' file

【讨论】:

  • 这里的关键位是匹配后的!:s/// 命令对不匹配的行执行。
【解决方案2】:

您的问题不清楚,并且您没有提供预期的输出,因此我们无法测试潜在的解决方案,但如果您只想将 chr 添加到它不存在的行的开头并且哪个不要以# 开头,那就是:

awk '!/^(#|chr)/{$0="chr" $0} 1' file

使用 GNU awk 覆盖原始文件是:

awk -i inplace '!/^(#|chr)/{$0="chr" $0} 1' file

以及任何 awk:

awk '!/^(#|chr)/{$0="chr" $0} 1' file > tmp && mv tmp file

【讨论】:

    【解决方案3】:

    这可以通过单个 sed 调用来完成。脚本本身类似于以下内容。

    如果你有格式的输入

    $ echo -e '#\n#\n123chr456\n789chr123\nabc'
    #
    #
    123chr456
    789chr123
    abc
    

    然后将 chr 添加到未注释的 chrless 行之前

    $ echo -e '#\n#\n123chr456\n789chr123\nabc' | sed '/^#/ {p
    d
    }
    /chr/ {p
    d
    }
    s/^/chr/'
    

    打印出来的

    #
    #
    123chr456
    789chr123
    chrabc
    

    (注意多行 sed 脚本。)

    现在您只需在文件上就地运行此脚本(-i 在现代 sed 版本中。)

    【讨论】:

    • 这不适用于echo -e '#\n#\n123chr456\nabc' | sed '/^#/ n; /chr/ n; s/^/chr/'
    • @Hazzard17 好的,所以多行计数和分号不能代替换行符,这是您唯一的观点吗?
    • 该点是以#开头的连续两行:在第二个chr被添加。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 2010-09-19
    • 2018-08-22
    相关资源
    最近更新 更多