【问题标题】:awk to skip lines up to and including pattern [duplicate]awk 跳过包含模式的行[重复]
【发布时间】:2017-11-16 20:40:03
【问题描述】:

我正在尝试使用 awk 跳过所有行,包括特定模式 /^#CHROM/ 并开始处理下面的行。 awk 确实执行但当前返回tab-delimited file 中的所有行。谢谢你:)。

文件

##INFO=<ID=ANN,Number=1,Type=Integer,Description="My custom annotation">
##source_20170530.1=vcf-annotate(r953) -d key=INFO,ID=ANN,Number=1,Type=Integer,Description=My custom annotation -c CHROM,FROM,TO,INFO/ANN
##INFO=<ID=,Number=A,Type=Float,Description="Variant quality">
#CHROM  POS ID  REF ALT
chr1    948846  .   T   TA  NA  NA
chr2    948852  .   T   TA  NA  NA
chr3    948888  .   T   TA  NA  NA

awk

awk -F'\t' -v OFS="\t" 'NR>/^#CHROM/ {print $1,$2,$3,$4,$5,"ID=1"$6,"ID=2"$7}' file

期望的输出

chr1    948846  .   T   TA  ID1=NA  ID2=NA
chr2    948852  .   T   TA  ID1=NA  ID2=NA
chr3    948888  .   T   TA  ID1=NA  ID2=NA

【问题讨论】:

  • 试试/^#CHROM/{f=1;next} f{print ...}f{print ...} /^#CHROM/{f=1}
  • /^#CHROM/ 是一个等同于$0~/^#CHROM/ 的正则表达式。您认为该比较的结果是行号还是布尔值 true/false?如果是布尔值,为什么要将它与当前行号(NR)进行比较?如果是行号,你认为当前行号是否大于当前行号的测试结果会是什么?

标签: awk vcf-variant-call-format


【解决方案1】:
awk 'BEGIN{FS=OFS="\t"} f{print $1,$2,$3,$4,$5,"ID1="$6,"ID2="$7} /^#CHROM/{f=1}' file

有关此和其他 awk 搜索习惯用法的详细信息,请参阅 https://stackoverflow.com/a/17914105/1745001。你的是那个页面上“b”的变体。

【讨论】:

    【解决方案2】:

    使用以下 awk 方法:

    awk -v OFS="\t" '/^#CHROM/{ r=NR }r && NR>r{ $6="ID=1"$6; $7="ID=2"$7; print }' file
    

    输出:

    chr1    948846  .   T   TA  ID=1NA  ID=2NA
    chr2    948852  .   T   TA  ID=1NA  ID=2NA
    chr3    948888  .   T   TA  ID=1NA  ID=2NA
    

    • /^#CHROM/{ r=NR } - 捕获 pattern 行号

    替代方法如下所示:

    awk -v OFS="\t" '/^#CHROM/{ f=1; next }f{ $6="ID=1"$6; $7="ID=2"$7; print }' file
    

    【讨论】:

    • 只需交换块,所以f在设置后被评估。
    • 谢谢大家:)。
    猜你喜欢
    • 2020-03-02
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多