2016-11-07 104 views
1

我試圖改變數千行長的DNA序列'標題'行內的列/字段。具體而言,我想改變報頭(compX_seqy)的第一個字段,它總是開始與「>」:AWK - 替換匹配行上的特定列,然後打印其他行

只是第一兩個序列的一個例子:

#cat example 

>comp0_seq1 444 [12:23] 
AGAGGACAC 
GATCCAACATA 
AGASCAC 
>comp0_seq2 333 [12:32:599:1] 
GTCGATC 
CYAACY 
CCCCA 
... 

我想添加一個「A」到第一柱的端部只,對於所有行開始「>」,

comp0_seq1A

然後打印該行的其餘部分,然後NEX t行(序列),直到達到下一個「>」行(並重復)。

我所要的輸出是這樣的:

>comp0_seq1A 444 [12:23] 
AGAGGACAC 
GATCCAACATA 
AGASCAC 
>comp0_seq2A 333 [12:32:599:1] 
GTCGATC 
CYAACY 
CCCCA 
... 

我想這第一:

awk '$1=$1"A"' example 

>comp0_seq1A 444 [12:23] 
AGAGGACACA 
GATCCAACATAA 
AGASCACA 
>comp0_seq2A 333 [12:32:599:1] 
GTCGATCA 
CYAACYA 
CCCCAA 
A 
A 

它增加了一個A到所有行的第一場,所以不大。

然後我想這一點,使用一個正則表達式來代替僅在啓動用線「>」

# awk '/^>/ {print $1=$1"A";getline;print $0}' example 
>comp0_seq1A 
AGAGGACAC 
>comp0_seq2A 
GTCGATC 

但是,只打印第一線賽後。那麼,如何在匹配/替換後直到下一個「>」打印全部/任何行?我試圖使用'下一個',但我想我不明白如何在這種情況下使用它。

有什麼建議嗎?我知道我很近,正在敲擊我的鍵盤。

Thx,LP。

回答

3

你已經差不多了。你只是想用你的getline來改變你的想法。

awk,下面應該工作:

$ awk '/^>/ {$1=$1"A"} 1' file.txt 

這是通過對匹配正則表達式^>所有線路運行在大括號的命令。最後的1是awk的簡稱,表示「打印當前行」。

用於替代另一種選擇這個簡單的辦法是使用sed

$ sed '/^>/s/ /A /' file.txt 

這是通過搜索匹配相同的正則表達式這一點,那麼用字符串(/A /)替換第一空間線。 sed將默認打印每行,因此不需要明確的打印。

或者如果你喜歡的東西,代替了第一個「場」,而不是第一個「字段分隔符」,這樣可以工作:

$ sed 's/^\(>[^ ]*\)/\1A/' file.txt 

默認情況下,sed正則表達式是「BRE」,所以分組括號需要逃脫。 \1是對搜索正則表達式中第一個(本例中爲「only」)括號表達式的引用。

+0

很好的答案。使用sed,我會使用「空白」字符類編寫'sed'/ ^> [^ [:blank:]] \ +/s //&A /'',以防該文件中有選項卡。 –

+0

感謝您的所有選擇。使用sed/substitute很簡單,可以用額外的字符替換空間。 –

+0

@glennjackman - 啊,偉大的建議使用'&'以及。我會保留我的答案,因爲它似乎與OP的數據一起工作,但感謝您的評論;它無疑會幫助其他可能有相似但不完全相同問題的人。 – ghoti