我有一个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如果这是最后一行,请重置.
如果需要,以换行符结束.
公认的解决方案很好,但是不是特别的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)
不要重新发明轮子。如果目标只是删除多行 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
conda:https://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
我会用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 命令一样。否则,删除模式空间中直到第一个换行符的文本,并使用生成的模式空间重新启动循环,而不读取新的输入行。