awk - 从变量追加字段

时间:2012-06-07 12:44:11

标签: 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)。

有人可以建议最佳方式来解决这个问题吗?

由于

伊恩

2 个答案:

答案 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