如何将 fasta 文件中的序列(多行)重新格式化为单行?

how can I reformat sequences (several lines) in a fasta file to single line?

输入"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]\)//g' file.fasta

我的错误输出:

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

header(首字母为“>”的行)的正则表达式是"^>.*$",但我不知道如何在sed命令中包含

提前致谢

$ awk '/^>/ {print (NR>1?"\n":"")[=10=];; next} {printf "%s",[=10=];} END{print "";}' file.fasta 
>chr1:117223140-117223856 TAG:GTGGG
GTGGgggggcgCATAGCAGCAGCAGCAGCAGCAGCAGCAGCAGCAGAGttaGTAGTATCGAATCGCACGACTGACAGCTCAGCATCAGCGACGACTAGTGGTGGGCGACGACAgCGATATA
>chr2:117223140-117223856 TAG:GGGCT
ACGAGCAGCAGCAGCAGCagCCGATCGACGACTCAAGTACGATACGCGaacCCCCCGACGACGACTCACGA

工作原理

  • /^>/ {print (NR>1?"\n":"")[=11=];; next}

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

  • printf "%s",[=16=];

    对于所有其他行,打印时不带尾随换行符。

  • END{print "";}

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

这可能对你有用 (GNU sed):

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

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