【问题标题】:Joining Line Breaks in FASTA file With Condition in SED/AWK/Perl one-liner在 SED/AWK/Perl 单行中加入 FASTA 文件中的换行符
【发布时间】:2011-01-22 13:11:22
【问题描述】:

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

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

正确的做法是什么?

【问题讨论】:

    标签: linux perl unix sed awk


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

    【讨论】:

    • 序列中有剩余的空格,例如“paxpaxpax pax”而不是“paxpaxpaxpax”。我怎样才能删除它?
    【解决方案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'
    

    【讨论】:

      【解决方案3】:
      perl -ne '!/^>/ ? chomp($p) : (chomp $_, $_.=" "); print $p; $p = $_; END{print $p}
      

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

      【讨论】:

        【解决方案4】:

        这可能对你有用:

        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
        

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 2012-04-17
            • 2016-10-29
            • 1970-01-01
            • 2013-03-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-12-01
            • 2017-06-16
            相关资源
            最近更新 更多