2010-03-02 34 views
6

我有一個看起來像這樣加入換行符在SED/AWK/Perl的一個班輪FASTA文件的具有條件

> sq1 
foofoofoobar 
foofoofoo 
> sq2 
quxquxquxbar 
quxquxquxbar 
quxx 
> sq3 
paxpaxpax 
pax 

我想要做的就是將它們連接成一個線的數據:

> sq1 foofoofoobarfoofoofoo 
> sq2 quxquxquxbarquxquxquxbarquxx 
> sq3 paxpaxpaxpax 

我試過這段代碼但失敗了。

sed -e 'te' -e 'H;$!d;:e' -e 'x;/^$/d;s/\n//g' 

什麼是正確的做法?

回答

4
$ awk '/^>/&&NR>1{print "";}{ printf "%s",/^>/ ? $0" ":$0 }' file 
> sq1 foofoofoobarfoofoofoo 
> sq2 quxquxquxbarquxquxquxbarquxx 
> sq3 paxpaxpaxpax 
+0

該序列中剩餘的空白,例如, 「paxpaxpax pax」而不是「paxpaxpaxpax」。我該如何刪除它? – neversaint 2010-03-02 01:32:58

+0

我看到了,所以你想在>之後留下空格,請參閱編輯 – ghostdog74 2010-03-02 01:57:05

2

這是做你想要使用的是什麼sed一個辦法:

sed -n '1{x;d;x};${H;x;s/\n/ /1;s/\n//g;p;b};/^>/{x;s/\n/ /1;s/\n//g;p;b};H' 
+0

+1。不錯,但對我的口味來說太難看又複雜。 – ghostdog74 2010-03-02 04:07:08

1
perl -ne '!/^>/ ? chomp($p) : (chomp $_, $_.=" "); print $p; $p = $_; END{print $p} 

...其中,當然如果需要的話,可以寫短了很多。

0

這是你的公司可能:

sed ':a;$!{N;ba};s/\n//g;s/> sq[0-9]*/\n& /g;s/.//' file 

或本:

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

或本:

awk -vRS='> sq' '{sub(/^/,RS);sub(/\n/," ");gsub(/\n/,"")};NR>1' file 
0

最短sed解決什麼,我能找到:

sed -n '/^>/!{H;$!b};s/$/ /;x;1b;s/\n//g;p' 
相關問題