如何仅线性化ipcress输出文件中的FASTA序列?
问题
使用ipcress进行虚拟PCR后,输出结果中的FASTA序列是分段换行的,需要仅将FASTA序列线性化,其余非FASTA的结果信息保持原样。
原始输出片段:
Ipcress result Experiment: Primer1 Primers: B A Target: QLOD02000001.1:filter(unmasked), whole genome shotgun sequence Matches: 20/20 20/20 Product: 2601 bp (range 100-5000) Result type: revcomp ipcress: QLOD02000001.1:filter(unmasked) Primer1 2601 B 91258 0 A 93839 0 revcomp >F-RK1_product_1 seq QLOD02000001.1:filter(unmasked) start 91258 length 2601 AAGCGGATTGAGAAGTGGTGGTGGTAGTAGCAGTCATGTGGGTAACGAAGACTACAACAGCAGTATTATA ATTAGGAAAAGGTTTGAAGAAAAGATGAGGCTTGAAAGGGACGACGACGACGACAAGATCTTCAATCCCA CCAAGTACTTTGTCCAAGAAGTTGTTAATTGCTTTGATGAGTCTGACCTCTACAGAACT... Ipcress result Experiment: Primer2 Primers: B A Target: QLOD02000001.1:filter(unmasked), whole genome shotgun sequence Matches: 20/20 20/20 Product: 854 bp (range 100-5000) Result type: revcomp ipcress: QLOD02000001.1:filter(unmasked) Primer2 854 B 149835 0 A 150669 0 revcomp >F-RK3_product_1 seq QLOD02000001.1:filter(unmasked) start 149835 length 854 AGGATGACATGGGAATCTGGGACCTCAACCATTTTGTCTAGCTCTCTCCCAAGAGAAAGCGACGAAAATG ACATGGGTTTGGCTCTGTATTGTTTAACAAATTTAAGTGGCTTAAAAACTCTAC....
期望输出:仅FASTA序列合并为单行,其余内容完全保留。
解决方案
以下是几种实用的实现方法:
方法1:Awk脚本(推荐)
直接处理整个文件,自动识别FASTA序列并线性化,同时完整保留所有其他内容:
awk ' # 遇到FASTA标题行或新的ipcress结果块起始行 /^>/ || /^Ipcress result/ { # 输出之前缓存的序列(如果有) if (seq != "") { print seq seq = "" } # 打印当前行 print next } # 序列行:追加到缓存变量 { seq = seq $0 } # 脚本结束时,打印最后一段缓存的序列 END { if (seq != "") print seq } ' input_file > output_file
将input_file替换为你的实际文件名,output_file为处理后的输出文件。
方法2:Sed命令
适合快速处理结构固定的文件:
sed -e '/^>/!{/^Ipcress result/!{H;d;}}' -e 'x;s/\n//g;x' input_file > output_file
原理:将所有序列行暂存到缓冲区,遇到标题行或结果块起始行时,将缓冲区的序列合并为单行后输出。
方法3:Seqkit(生物信息专用工具)
如果已安装seqkit(可通过conda/pip安装),可拆分处理后合并:
# 提取非FASTA内容到临时文件 grep -v "^>" input_file > temp_non_fasta.txt # 提取并线性化FASTA内容 grep -A 999 "^>" input_file | seqkit seq -w 0 > temp_fasta.txt # 合并两个文件(适用于结果块与FASTA一一对应的情况) # 若需要更精准的合并,建议使用方法1的awk脚本
内容的提问来源于stack exchange,提问作者Najoua
相关产品推荐
相关产品推荐

