在SED / AWK / Perl中单行添加条件在FASTA文件中join换行符

我有一个看起来像这样的数据

> 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' 

什么是正确的方法来做到这一点?

Solutions Collecting From Web of "在SED / AWK / Perl中单行添加条件在FASTA文件中join换行符"

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

这是使用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' 
 perl -ne '!/^>/ ? chomp($p) : (chomp $_, $_.=" "); print $p; $p = $_; END{print $p} 

如果需要的话,当然可以写得更短。

这可能对你有用:

 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 

最短的sed解决方案,我能找到:

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