首页 文章

删除FASTA文件中的换行符

提问于
浏览
6

我有一个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 回答

  • 4

    这个 awk 计划:

    % awk '!/^>/ { printf "%s", $0; n = "\n" } 
    /^>/ { print n $0; n = "" }
    END { printf "%s", n }
    ' input.fasta
    

    将产量:

    >accession1
    ATGGCCCATGGGATCCTAGC
    >accession2
    GATATCCATGAAACGGCTTA
    

    说明:

    在不以 > 开头的行上,打印没有换行符的行并存储换行符(在变量 n 中)以供日后使用 .

    在以 > 开头的行上,打印存储的换行符(如果有)和行 . 重置 n ,以防这是最后一行 .

    如果需要,以换行符结束 .

    注意:

    默认情况下,变量初始化为空字符串 . 没有必要在awk中明确地“初始化”变量,这是你在c和大多数其他传统语言中所做的 .

  • 0

    还有另一个awk单行,应该适合你的情况 .

    awk '/^>/{print s? s"\n"$0:$0;s="";next}{s=s sprintf("%s",$0)}END{if(s)print s}' file
    
  • 3

    接受的解决方案很好,但并不是特别的AWKish . 考虑使用此代替:

    awk '/^>/ { print (NR==1 ? "" : RS) $0; next } { printf "%s", $0 } END { printf RS }' file
    

    说明:

    对于以 > 开头的行,请打印该行 . 如果该行不是文件中的第一行,则使用三元运算符来打印前导换行符 . 对于不以 > 开头的行,打印没有尾随换行符的行 . 由于文件中的最后一行不以 > 开头,因此使用 END 块打印最终换行符 .

    请注意,通过设置空输出记录分隔符,启用默认打印并重新分配以 > 开头的行,也可以更简单地编写上述内容 . 尝试:

    awk -v ORS= '/^>/ { $0 = (NR==1 ? "" : RS) $0 RS } END { printf RS }1' file
    
  • 2

    为此,我会使用 sed . 使用 GNU sed

    sed ':a; $!N; /^>/!s/\n\([^>]\)/\1/; ta; P; D' file
    

    结果:

    >accession1
    ATGGCCCATGGGATCCTAGC
    >accession2
    GATATCCATGAAACGGCTTA
    

    说明:

    创建一个标签 a . 如果该行不是文件中的最后一行,请将其附加到模式空间 . 如果该行不以字符 > 开头,请执行替换 s/\n\([^>]\)/\1/ . 如果自读取最后一个输入行以来替换成功,则转移到标签 a . 打印到当前模式空间的第一个嵌入换行符 . 如果模式空间不包含换行符,则启动正常的新循环,就像发出d命令一样 . 否则,删除模式空间中直到第一个换行符的文本,然后使用生成的模式空间重新启动循环,而不读取新的输入行 .

  • 11

    另一种变化:-)

    awk '!/>/{printf( "%s", $0);next}
         NR>1{printf( "\n")} 
         END {printf"\n"}
         7' YourFile
    
  • 0

    您可能对bioawk感兴趣,它是awk的改编版本,可以调整处理fasta文件

    bioawk -c fastx '{ gsub(/\n/,"",seq); print ">"$name; print $seq }' file.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兼容 .

相关问题