如何将 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
查看两行,如果其中不包含 >
则删除它们之间的换行符并重复。如果其中任何一行确实包含 >
,则打印并删除其中的第一行,然后重复。
输入"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
查看两行,如果其中不包含 >
则删除它们之间的换行符并重复。如果其中任何一行确实包含 >
,则打印并删除其中的第一行,然后重复。