【问题标题】:awk - append field from variableawk - 从变量追加字段
【发布时间】:2012-06-07 21:11:51
【问题描述】:

第一次在这里发帖,这是一个 awk 问题。

我有一个如下所示的文件:

Motif name class from to strand sequence score
>ENSBTAG00000000436                         
MA0079.2 SP1 Zinc-coordinating 29 38 - agggggtggg 6.33
... (50 similar lines)
>ENSBTAG00000000380                         
MA0113.1 NR3C1 Zinc-coordinating 92 109 - ccagaaagtgcttctccc 7.03
... (57 similar lines)

等等。请注意,>ENSBTA 行是一组记录的“标签”。所以我想要的是将 >ENSBTA 行作为字段附加到以 MA 开头的行中......即

MA0079.2 SP1 Zinc-coordinating 29 38 - agggggtggg 6.33 >ENSBTAG00000000436

到现在为止

awk '{if (NR>1&&NF==1) genename=$1; if (NR>1&&NF>1) print $0, genename}'

这非常接近,但它没有将 ENST 标识符与正确的行保持一致。因此,参考上面的示例,并非文件第二部分的所有 57 行都获得了正确的标识符(ENSBTAG00000000380)。

有人可以建议解决此问题的最佳方法吗?

谢谢

伊恩

【问题讨论】:

    标签: awk


    【解决方案1】:

    未经测试,但这样的东西应该接近你想要的:

    awk '/^>ENSBTAG/{tag=$0;}/^MA/{print $0,tag}'
    

    本质上说,如果该行与行首的“>ENSBTAG”匹配,则将该行保存在一个变量中,但如果它与行首的“MA”匹配,则打印附加了最新标签的行.

    如果您的记录行不总是匹配“^MA”(示例中的所有行都匹配,但我不想假设),或者如果标签有时看起来有点不同,您需要相应地修改正则表达式。

    【讨论】:

    • 谢谢。这很棒,而且与我的方法完全不同——也很有教育意义。
    【解决方案2】:

    这个 oneliner 会给你以下输出(见测试)。第一行 "Motif name class from to strand sequence score" 也会被打印出来。

    awk '/^>[A-Z]*/{l=$0;next;}{print $0" "l}' file
    

    测试

    kent$  cat a
    Motif name class from to strand sequence score
    >ENSBTAG00000000436
    MA0079.2 SP1 Zinc-coordinating 29 38 - agggggtggg 6.33
    MA0080.2 SP1 Zinc-coordinating 29 38 - agggggtggg 6.34
    MA0082.2 SP1 Zinc-coordinating 29 38 - agggggtggg 6.35
    >ENSBTAG00000000380
    MA0113.1 NR3C1 Zinc-coordinating 92 109 - ccagaaagtgcttctccc 7.03
    MA0113.1 NR3C1 Zinc-coordinating 92 109 - ccagaaagtgcttctccc 7.04
    MA0113.1 NR3C1 Zinc-coordinating 92 109 - ccagaaagtgcttctccc 7.05
    
    kent$  awk '/^>[A-Z]*/{l=$0;next;}{print $0" "l}' a
    Motif name class from to strand sequence score 
    MA0079.2 SP1 Zinc-coordinating 29 38 - agggggtggg 6.33 >ENSBTAG00000000436
    MA0080.2 SP1 Zinc-coordinating 29 38 - agggggtggg 6.34 >ENSBTAG00000000436
    MA0082.2 SP1 Zinc-coordinating 29 38 - agggggtggg 6.35 >ENSBTAG00000000436
    MA0113.1 NR3C1 Zinc-coordinating 92 109 - ccagaaagtgcttctccc 7.03 >ENSBTAG00000000380
    MA0113.1 NR3C1 Zinc-coordinating 92 109 - ccagaaagtgcttctccc 7.04 >ENSBTAG00000000380
    MA0113.1 NR3C1 Zinc-coordinating 92 109 - ccagaaagtgcttctccc 7.05 >ENSBTAG00000000380
    

    【讨论】:

    • 谢谢肯特。这也很棒。我没有像你们俩那样使用正则表达式。需要刷新我的方法! :-)
    猜你喜欢
    • 1970-01-01
    • 2014-05-13
    • 2021-06-01
    • 2015-06-03
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 2014-12-10
    相关资源
    最近更新 更多