2012-06-07 65 views
1

首先發布在這裏,它是和awk的問題。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行是一組記錄的「標籤」。所以,想什麼,我是開始MA的> ENSBTA線被追加作爲線場...即

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)。

有人可以請建議最好的方式去做這件事嗎?

感謝

伊恩

回答

1

沒有測試,但是這樣的事情應該自己想要的是接近:

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

,說基本上如果線路匹配「> ENSBTAG」在將該行保存在一個變量中,但是如果它與行的開頭處的「MA」匹配,則打印添加了最新標記的行。

如果您的記錄行不總是匹配「^ MA」(示例中的所有記錄都行,但我不想這麼做),或者標記有時看起來有點不同,需要相應地修改正則表達式。

+0

感謝。這很好,與我的方式很不一樣 - 也很有教育意義。 – duff

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 
+0

謝謝肯特。這也很好。我沒有想過使用正則表達式,因爲你們都這樣做了。需要刷新我的方法! :-) – duff