我有一个fasta文件,用换行符分解序列 . 我想删除换行符 . 这是我的文件的一个例子:
>accession1
ATGGCCCATG
GGATCCTAGC
>accession2
GATATCCATG
AAACGGCTTA
我想把它转换成这个:
>accession1
ATGGCCCATGGGATCCTAGC
>accession2
GATATCCATGAAACGGCTTA
我找到了一个潜在的解决方案on this site,看起来像这样:
cat input.fasta | awk '{if (substr($0,1,1)==">"){if (p){print "\n";} print $0} else printf("%s",$0);p++;}END{print "\n"}' > joinedlineoutput.fasta
但是,这会在每个条目之间放置一个额外的换行符,因此文件如下所示:
>accession1
ATGGCCCATGGGATCCTAGC
>accession2
GATATCCATGAAACGGCTTA
我是一个awk noob,但我开始修改命令 . 我的猜测是 if (p){print "\n";}
是罪魁祸首......可能 print "\n"
正在添加两个换行符 . 我不能't figure out how to add just one newline...this is probably something easy, but like I said, I'一个菜鸟 . 这是我的(不成功)解决方案:
awk '{if (substr($0,1,1)==">"){print "\n"$0} else printf("%s",$0);p++;}END{print "\n"}' input.fasta > joinedoutput.fasta
但是,这会在文件开头添加一个空行,因为它在打印第一个入藏号之前始终打印一个新行:
{empty line}
>accession1
ATGGCCCATGGGATCCTAGC
>accession2
GATATCCATGAAACGGCTTA
任何人都有解决方案来获取正确格式的文件?谢谢!
6 回答
这个
awk
计划:将产量:
说明:
在不以
>
开头的行上,打印没有换行符的行并存储换行符(在变量n
中)以供日后使用 .在以
>
开头的行上,打印存储的换行符(如果有)和行 . 重置n
,以防这是最后一行 .如果需要,以换行符结束 .
注意:
还有另一个awk单行,应该适合你的情况 .
接受的解决方案很好,但并不是特别的AWKish . 考虑使用此代替:
说明:
对于以
>
开头的行,请打印该行 . 如果该行不是文件中的第一行,则使用三元运算符来打印前导换行符 . 对于不以>
开头的行,打印没有尾随换行符的行 . 由于文件中的最后一行不以>
开头,因此使用END
块打印最终换行符 .请注意,通过设置空输出记录分隔符,启用默认打印并重新分配以
>
开头的行,也可以更简单地编写上述内容 . 尝试:为此,我会使用
sed
. 使用GNU sed
:结果:
说明:
创建一个标签
a
. 如果该行不是文件中的最后一行,请将其附加到模式空间 . 如果该行不以字符>
开头,请执行替换s/\n\([^>]\)/\1/
. 如果自读取最后一个输入行以来替换成功,则转移到标签a
. 打印到当前模式空间的第一个嵌入换行符 . 如果模式空间不包含换行符,则启动正常的新循环,就像发出d命令一样 . 否则,删除模式空间中直到第一个换行符的文本,然后使用生成的模式空间重新启动循环,而不读取新的输入行 .另一种变化:-)
您可能对bioawk感兴趣,它是awk的改编版本,可以调整处理fasta文件
Note: BioAwk基于Brian Kernighan's awk,记录在"The AWK Programming Language", by Al Aho, Brian Kernighan, and Peter Weinberger (Addison-Wesley, 1988, ISBN 0-201-07981-X)中 . 我不确定这个版本是否与POSIX兼容 .