删除FASTA文件中的换行符

chi*_*ric 8 unix awk fasta

我有一个fasta文件,用换行符分解序列.我想删除换行符.这是我的文件的一个例子:

>accession1
ATGGCCCATG
GGATCCTAGC
>accession2
GATATCCATG
AAACGGCTTA
Run Code Online (Sandbox Code Playgroud)

我想把它转换成这个:

>accession1
ATGGCCCATGGGATCCTAGC
>accession2
GATATCCATGAAACGGCTTA
Run Code Online (Sandbox Code Playgroud)

在这个网站上找到了一个潜在的解决方案,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

但是,这会在每个条目之间放置一个额外的换行符,因此文件如下所示:

>accession1
ATGGCCCATGGGATCCTAGC

>accession2
GATATCCATGAAACGGCTTA
Run Code Online (Sandbox Code Playgroud)

我是一个awk noob,但我开始修改命令.我的猜测是if (p){print "\n";}罪魁祸首......可能print "\n"会增加两个换行符.我无法弄清楚如何只添加一个换行符...这可能很简单,但就像我说的那样,我是一个菜鸟.这是我的(不成功)解决方案:

awk '{if (substr($0,1,1)==">"){print "\n"$0} else printf("%s",$0);p++;}END{print "\n"}' input.fasta > joinedoutput.fasta
Run Code Online (Sandbox Code Playgroud)

但是,这会在文件开头添加一个空行,因为它在打印第一个入藏号之前始终打印一个新行:

{empty line} 
>accession1
ATGGCCCATGGGATCCTAGC
>accession2
GATATCCATGAAACGGCTTA
Run Code Online (Sandbox Code Playgroud)

任何人都有解决方案来获取正确格式的文件?谢谢!

Joh*_*web 11

这个awk程序:

% awk '!/^>/ { printf "%s", $0; n = "\n" } 
/^>/ { print n $0; n = "" }
END { printf "%s", n }
' input.fasta
Run Code Online (Sandbox Code Playgroud)

将产量:

>accession1
ATGGCCCATGGGATCCTAGC
>accession2
GATATCCATGAAACGGCTTA
Run Code Online (Sandbox Code Playgroud)

说明:

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

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

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

注意:

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

- 6.1.3.1在程序中使用变量,GNU Awk用户指南


Ste*_*eve 7

公认的解决方案很好,但是不是特别的AWKish。考虑改用以下方法:

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

说明:

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

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

awk -v ORS= '/^>/ { $0 = (NR==1 ? "" : RS) $0 RS } END { printf RS }1' file
Run Code Online (Sandbox Code Playgroud)


Tim*_*and 6

不要重新发明轮子。如果目标只是删除多行 fasta 文件中的换行符(展开 fasta 文件),请使用任何专门的生物信息学工具,例如seqtk,如下所示:

seqtk seq -l 0 input_file
Run Code Online (Sandbox Code Playgroud)

例子:

# Create the input for testing:

cat > test_unwrap_in.fa <<EOF

>seq1 with blanks
ACGT ACGT ACGT
>seq2 with newlines
ACGT

ACGT

ACGT

>seq3 without blanks or newlines
ACGTACGTACGT

EOF

# Unwrap lines:

seqtk seq -l 0 test_unwrap_in.fa > test_unwrap_out.fa

cat test_unwrap_out.fa
Run Code Online (Sandbox Code Playgroud)

输出:

>seq1 with blanks
ACGT ACGT ACGT
>seq2 with newlines
ACGTACGTACGT
>seq3 without blanks or newlines
ACGTACGTACGT
Run Code Online (Sandbox Code Playgroud)

也可以看看:

seqtk用法:

seqtk seq

Usage:   seqtk seq [options] <in.fq>|<in.fa>

Options: ...
         -l INT    number of residues per line; 0 for 2^32-1 [0]
Run Code Online (Sandbox Code Playgroud)

要安装此工具,请conda具体使用miniconda,例如:

conda create --channel bioconda --name seqtk seqtk
conda activate seqtk
# ... use seqtk here ...
conda deactivate
Run Code Online (Sandbox Code Playgroud)

参考:

seqtk:https: //github.com/lh3/seqtk
condahttps://docs.conda.io/projects/conda/en/latest/user-guide/install/index.html
conda create: https: //docs.conda.io /projects/conda/en/latest/commands/create.html


Ste*_*eve 5

我会用sed这个。使用GNU sed

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

结果:

>accession1
ATGGCCCATGGGATCCTAGC
>accession2
GATATCCATGAAACGGCTTA
Run Code Online (Sandbox Code Playgroud)

解释:

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