你能建议我如何结合吗?
a.fasta 具有 10000 个序列,其中包含标头 1, 2, 3, .... 10000 .......................仅包含一个标头,例如
>1
AAATTTTGGGGCCC
>2
ACCCCGGGTTT
..........
>10000
ATGCCCCCCCCCC
输出:
>1
AAATTTTGGGGCCCACCCCGGGTTTATGCCCCCCCCCC
答案1
awk '
/^>/ {
# print the first header
if (c++ == 0) {print; print ""}
next
}
/^$/ {next}
{printf "%s", $0}
END {print ""}
' a.fasta > b.fasta
b.fasta 的内容
>1
AAATTTTGGGGCCCACCCCGGGTTT..........ATGCCCCCCCCCC
答案2
最简单的方法是只打印第一行,然后打印文件中不包含 i) 任何空格字符(它们与 fasta 文件无关)和 ii) fasta 标题行 ( >
) 的所有其他行:
head -n 1 file.fa > newfile.fa; grep -P '^[^> ]+$' >> newfile.fa
打印第一行,并且 grep 正则表达式从行的开头 ( ) 到结尾 ( )head
查找仅包含非字符>
和非空格字符 ( ) 的所有行。[^> ]
^
$
但是,这将产生如下文件:
>1
AAATTTTGGGGCCC
ACCCCGGGTTT
ATGCCCCCCCCCC
要将整个序列放在同一行上,请使用以下命令:
head -n 1 file.fa > newfile.fa; grep -P '^[^> ]+$' | tr -d '\n'>> newfile.fa;
然后,您可以使用以下命令在文件末尾添加额外的换行符
echo "" >> newfile.fa
但是,如果您要使用此类文件,我建议您将这两个脚本保存在 $PATH 中的文件中($HOME/bin
例如)并使它们可执行(chmod a+x $HOME/bin/scriptname
):
快速转Tbl
该脚本获取一个 fasta 文件并将其更改为 tbl 格式(fasta 标头、制表符和序列,全部在一行上):
#! /bin/sh
gawk '{
if (substr($1,1,1)==">")
if (NR>1)
printf "\n%s\t", substr($0,2,length($0)-1)
else
printf "%s\t", substr($0,2,length($0)-1)
else
printf "%s", $0
}END{printf "\n"}' "$@"
TblToFasta
这则相反,它接受 tbl 格式的文件并将其转换为正确的 fasta 文件(>
标题和每行 60 个字符):
#! /bin/sh
gawk '{
sequence=$NF
ls = length(sequence)
is = 1
fld = 1
# if (fld == 1){printf ">"}
while (fld < NF)
{
if (fld == 1){printf ">"}
printf "%s " , $fld
if (fld == NF-1)
{
printf "\n"
}
fld = fld+1
}
while (is <= ls)
{
printf "%s\n", substr(sequence,is,60)
is=is+60
}
}' "$@"
现在,如果您有这些可用的脚本,您只需运行以下命令就可以完成您所要求的操作:
$ head -n 1 file.fa; FastaToTbl file.fa | awk -F"\t" '{print $2}'
>1
AAATTTTGGGGCCC
ACCCCGGGTTT..........
ATGCCCCCCCCCC
或者,要获取正确的 fasta 文件:
$ head -n 1 file.fa > newfile; FastaToTbl file.fa |
awk -F"\t" '{printf "%s", $2}' | TblToFasta >> newfile
其产生:
>1
AAATTTTGGGGCCCACCCCGGGTTT..........ATGCCCCCCCCCC
答案3
{ echo '>1'; tr -dc '[:alpha:]'; } <infile >outfile
您不需要从文件中获取第一行 - 只需echo
获取标题即可。如果您删除除字母字符之外的所有内容,那么您就会自动获得您想要的内容。