2012-12-21 12 views
-2

我有一個由彙編器生成的文件。它看起來像下面。合併從contigs生成的兩行代碼

>NODE_1_length_211_cov_22.379147 
CATTTGCTGAAGAAAAATTACGAGAAATGGAGCACAAGGCTGTTTTTGTGAATGTCAAAC 
CAAGTGACAACTCTATAGCGTTTGTATAAGACTCTCATACTAATCCCAAGCAAACTCTAT 
ACTGACGCATGAACATGGAAGAGAAATGCTGCTCGTGTATGTATTATGGACCAGCTTGGA 
ACACCATGTTAGGACTTTATAGATGTCTTACGATTTTTTCGACGTGATGAAGAAGTCTAT 
TCAGCATTTGA 
>NODE_2_length_85_cov_19.094118 
TACTCCTGAGCACTTTGTGCTCTTAGTTCTTACTAGAACTGTTACAGCTCCACGAACTTG 
TCGACTCTTTGAGTCAATTTCTGTTAGTTCCTACGAACTAAGAGGCTCTCTGAGCCCAGT 
CTTCC 

我想用這種方式合併使用python或linux sed命令的行並想要結果。

>NODE_1_length_211_cov_22.379147 
CATTTGCTGAAGAAAAATTACGAGAAATGGAGCACAAGGCTGTTTTTGTGAATGTCAAACCAAGTGACAACTCTATAGCGTTTGTATAAGACTCTCATACTAATCCCAAGCAAACTCTATACTGACGCATGAACATGGAAGAGAAATGCTGCTCGTGTATGTATTATGGACCAGCTTGGAACACCATGTTAGGACTTTATAGATGTCTTACGATTTTTTCGACGTGATGAAGAAGTCTATTCAGCATTTGA 
>NODE_2_length_85_cov_19.094118 
TACTCCTGAGCACTTTGTGCTCTTAGTTCTTACTAGAACTGTTACAGCTCCACGAACTTGTCGACTCTTTGAGTCAATTTCTGTTAGTTCCTACGAACTAAGAGGCTCTCTGAGCCCAGTCTTCC 

像每個seqeunce考慮爲單行和節點名稱一樣。

+9

歡迎來到Stack Overflow!看起來你希望我們爲你寫一些代碼。儘管許多用戶願意爲遇險的編碼人員編寫代碼,但他們通常只在海報已嘗試自行解決問題時才提供幫助。證明這一努力的一個好方法是包含迄今爲止編寫的代碼,示例輸入(如果有的話),期望的輸出和實際獲得的輸出(控制檯輸出,堆棧跟蹤,編譯器錯誤 - 無論是適用)。您提供的細節越多,您可能會收到的答案就越多。 –

+0

@MartijnPieters問號是一個錯字,我認爲'''是文件的一部分,看起來像[FASTA](http://en.wikipedia.org/wiki/FASTA_format)給我 –

+2

是的,給我們展示一些愛通過添加你到目前爲止的代碼。 – hochl

回答

1

您可以使用awk做的工作:

awk < input_file '/^>/ {print ""; print; next} {printf "%s", $0} END {print ""}' 

這僅啓動一個進程(awk)。唯一的缺點是:它增加了一個空的第一行。您可以通過添加一個狀態變量來避免這樣的事情(代碼屬於在同一行,它只是爲了使其更好地讀取):

awk < input_file '/^>/ { if (flag) print ""; print; flag=0; next } 
    { printf "%s", $0; flag=1 } END { if (flag) print "" }' 

@how將其存儲在一個新的文件:

awk <input_file> output_file '/^>/ { .... }' 
+0

它正在工作,但如何將它存儲在一個新的文件。 – user1921307

+0

非常感謝你的工作,因爲我想。 – user1921307

+0

printf的概要是'printf格式,數據'。使用它作爲'printf data'意味着'data'被當作沒有數據的格式化字符串,所以如果你的輸入包含%s或者任何其他printf格式字符,那麼它就會糟糕透頂。你需要'printf'%s「,$ 0'而不是'printf $ 0'。 –

2

trsed小煙槍這樣做:

$ tr -d '\n' < contigser.fa | sed 's/\(>[^.]\+\.[0-9]\+\)/\n\1\n/g' > newfile.fa 

python

file = open('contigser.fa','r+') 
lines= file.read().splitlines() 

file.seek(0) 
file.truncate() 

for line in lines: 
    if line.startswith('>'): 
     file.write('\n'+line+'\n') 
    else: 
     file.write(line) 

注:蟒蛇存儲解決方案更改回contigser.fa

+0

確定這不會在一行的輸出中給出'> NODE_2_length_85_cov_19.094118TACTCCTGAGCACTTTGTGCTCTTAGTTCT ...''? – hochl

+0

@hochl好點,給我秒... –

+0

但通常這個想法是好的;-)我認爲你需要包括一些awkishness。 – hochl

0
$ awk '/^>/{printf "%s%s\n",(NR>1?ORS:""),$0; next} {printf "%s",$0} END{print ""}' file 
>NODE_1_length_211_cov_22.379147 
CATTTGCTGAAGAAAAATTACGAGAAATGGAGCACAAGGCTGTTTTTGTGAATGTCAAACCAAGTGACAACTCTATAGCGTTTGTATAAGACTCTCATACTAATCCCAAGCAAACTCTATACTGACGCATGAACATGGAAGAGAAATGCTGCTCGTGTATGTATTATGGACCAGCTTGGAACACCATGTTAGGACTTTATAGATGTCTTACGATTTTTTCGACGTGATGAAGAAGTCTATTCAGCATTTGA 
>NODE_2_length_85_cov_19.094118 
TACTCCTGAGCACTTTGTGCTCTTAGTTCTTACTAGAACTGTTACAGCTCCACGAACTTGTCGACTCTTTGAGTCAATTTCTGTTAGTTCCTACGAACTAAGAGGCTCTCTGAGCCCAGTCTTCC 
0
$ awk 'NR==1;ORS="";{sub(/>.*$/,"\n&\n");print (NR>1)?$0:""}END{print"\n"}' file 
>NODE_1_length_211_cov_22.379147 
CATTTGCTGAAGAAAAATTACGAGAAATGGAGCACAAGGCTGTTTTTGTGAATGTCAAACCAAGTGACAACTCTATAGCGTTTGTATAAGACTCTCATACTAATCCCAAGCAAACTCTATACTGACGCATGAACATGGAAGAGAAATGCTGCTCGTGTATGTATTATGGACCAGCTTGGAACACCATGTTAGGACTTTATAGATGTCTTACGATTTTTTCGACGTGATGAAGAAGTCTATTCAGCATTTGA 
>NODE_2_length_85_cov_19.094118 
TACTCCTGAGCACTTTGTGCTCTTAGTTCTTACTAGAACTGTTACAGCTCCACGAACTTGTCGACTCTTTGAGTCAATTTCTGTTAGTTCCTACGAACTAAGAGGCTCTCTGAGCCCAGTCTTCC 
0

這可能爲你工作(GNU SED):

sed '/^>/n;:a;$!N;s/\n\([^>]\)/\1/;ta;P;D' file 

在以>開頭的行後面,刪除除>符號以外的任何字符之前的任何換行符。