使用SED / AWK / Perl单行中的条件加入FASTA文件中的换行符

时间:2010-03-02 01:14:38

标签: linux perl unix sed awk

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

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

这样做的正确方法是什么?

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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'

答案 2 :(得分:1)

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

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

答案 3 :(得分: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

答案 4 :(得分:0)

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

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