首先在这里发帖,这是问题和问题。
我有一个看起来像这样的文件:
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)。
有人可以建议最佳方式来解决这个问题吗?
由于
伊恩
答案 0 :(得分:1)
未经测试,但这样的事情应该接近你想要的东西:
awk '/^>ENSBTAG/{tag=$0;}/^MA/{print $0,tag}'
这基本上说如果该行在行的开头匹配“> ENSBTAG”,将该行保存在变量中,但如果它与行的开头匹配“MA”,则打印带有最新标记的行追加。
如果您的记录行不总是匹配“^ MA”(示例中的所有记录行都有,但我不想假设),或者如果标记有时看起来有点不同,那么您需要相应地修改正则表达式。
答案 1 :(得分:1)
这个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