代码之家  ›  专栏  ›  技术社区  ›  Jose Ricardo Bustos M.

如何将fasta文件中的序列(几行)重新格式化为单行?[副本]

  •  1
  • Jose Ricardo Bustos M.  · 技术社区  · 9 年前

    输入“file.fasta”( 笔记 ,这是一个示例……在fasta文件中,序列可能有三行以上)

    >chr1:117223140-117223856 TAG:GTGGG
    GTGGgggggcgCATAGCAGCAGCAGCAGCAGCAGCAGCAGCAGCAGAGtt
    aGTAGTATCGAATCGCACGACTGACAGCTCAGCATCAGCGACGACTAGTG
    GTGGGCGACGACAgCGATATA
    >chr2:117223140-117223856 TAG:GGGCT
    ACGAGCAGCAGCAGCAGCagCCGATCGACGACTCAAGTACGATACGCGaa
    cCCCCCGACGACGACTCACGA
    

    预期产量

    >chr1:117223140-117223856 TAG:GTGGG
    GTGGgggggcgCATAGCAGCAGCAGCAGCAGCAGCAGCAGCAGCAGAGttaGTAGTATCGAATCGCACGACTGACAGCTCAGCATCAGCGACGACTAGTGGTGGGCGACGACAgCGATATA
    >chr2:117223140-117223856 TAG:GGGCT
    ACGAGCAGCAGCAGCAGCagCCGATCGACGACTCAAGTACGATACGCGaacCCCCCGACGACGACTCACGA
    

    我的努力: sed 命令

    sed ':a;N;$!ba;s/\([actgACGT]\)\n\([actgACGT]\)/\1\2/g' file.fasta
    

    我的错误输出:

    >chr1:117223140-117223856 TAG:GTGGGGTGGgggggcgCATAGCAGCAGCAGCAGCAGCAGCAGCAGCAGCAGAGttaGTAGTATCGAATCGCACGACTGACAGCTCAGCATCAGCGACGACTAGTGGTGGGCGACGACAgCGATATA
    >chr2:117223140-117223856 TAG:GGGCTACGAGCAGCAGCAGCAGCagCCGATCGACGACTCAAGTACGATACGCGaacCCCCCGACGACGACTCACGA
    

    标头的正则表达式(第一个字母为“>”的行)是 "^>.*$" ,但我不知道如何包含在 已安装的 命令

    提前谢谢

    2 回复  |  直到 9 年前
        1
  •  1
  •   potong    9 年前

    这可能适用于您(GNU sed):

    sed ':a;N;/>/!s/\n//;ta;P;D' file
    

    查看两行,如果其中一行不包含 > 删除它们之间的换行符并重复。如果其中一行包含 > 然后打印并删除其中的第一个,然后重复。

        2
  •  1
  •   John1024 David C. Rankin    9 年前
    $ awk '/^>/ {print (NR>1?"\n":"")$0;; next} {printf "%s",$0;} END{print "";}' file.fasta 
    >chr1:117223140-117223856 TAG:GTGGG
    GTGGgggggcgCATAGCAGCAGCAGCAGCAGCAGCAGCAGCAGCAGAGttaGTAGTATCGAATCGCACGACTGACAGCTCAGCATCAGCGACGACTAGTGGTGGGCGACGACAgCGATATA
    >chr2:117223140-117223856 TAG:GGGCT
    ACGAGCAGCAGCAGCAGCagCCGATCGACGACTCAAGTACGATACGCGaacCCCCCGACGACGACTCACGA
    

    它的工作原理

    • /^>/ {print (NR>1?"\n":"")$0;; next}

      如果该行以 > ,即如果正则表达式 /^>/ 如果为真,则打印该行。如果这不是第一行,即 NR>1 ,然后在该行前面打印一个换行符。然后,跳过其余命令并跳转到 next 线

    • printf "%s",$0;

      对于所有其他行,打印时不要使用换行符。

    • END{print "";}

      到达文件末尾后,打印最后一个换行符。