cat *.fa
合并fasta
文件的坑
平常我们在合并fasta文件的时候,常常会使用到一句命令
cat *.fa > total.fa
cat *.fasta > total.fasta
其实原理就是将所有的.fa
或者.fasta
文件按顺序输出到标准输出之中,之后使用>
重定向到新的文件中。
但是在有的时候,会发生一些奇怪的事情。
正常情况
比如我有三个fasta
文件
1.fasta
>1
ATGACTGATGCTGCAGT
CGTAGCTAGCTCGATGA
ATGTC
2.fasta
>2
GTTGTACGTGCTAGTGC
GCTAGCTAGCTGTAGCT
ACAC
3.fasta
>3
CGTAGCTAGCTGACTCC
CGAGC
将这三个文件放到一个文件中,注意要完全复制里面的内容。
# 新建文件夹,将新生成的fasta文件放在里面,避免循环往复的cat而导致错误
mkdir temp
cat *.fasta > ./temp/total.fasta
然后查看序列名称
cat ./temp/total.fasta | grep "^>"
得到结果
>1
>2
>3
没有问题。
异常
1.fasta
>1
ATGACTGATGCTGCAGT
CGTAGCTAGCTCGATGA
ATGTC
2.fasta
>2
GTTGTACGTGCTAGTGC
GCTAGCTAGCTGTAGCT
ACAC
3.fasta
>3
CGTAGCTAGCTGACTCC
CGAGC
同样的还是这三个,将里面内容复制之前的fasta文件中
mkdir temp
cat *.fasta > ./temp/total.fasta
cat ./temp/total.fasta | grep "^>"
结果
>1
这次>
打头的行只有一行呢,其他两个跑哪儿去了?这里不加^
位置锚定标志来找一找它们藏在哪儿
cat ./temp/total.fasta | grep ">"
输出为
>1
ATGTC>2
ACAC>3
结果>2
和>3
竟然是跟在前一个fasta文件的屁股后面!
原因
原因就在于fasta
文件的结尾没有一行空行,也就是在文件末尾不是由空行结尾,而是序列作为结尾,在序列的尾巴那儿没有换行符,所以导致了前面的fasta文件的序列与后面的fasta文件的序列名的>
连到了一块。在数据库中下载的fasta
文件一般都是以空行结尾,但是我们自已写脚本或者手动生成的fasta
文件合并的时候就可能出现异常情况,这种情况会导致在后续分析的时候报错。
如果说报错还好,就怕那种不报错的,在这里三条序列被当作一条序列对待了,那生成的结果自然就有问题!
-
正常情况的合并
正常情况.png -
异常情况下的合并
异常情况.png
解决办法
如果不确定fasta
文件是否是以空行结尾,那么保险起见就这样做:
for i in $(ls *.fasta);
do
cat ${i}
# 在每一个fasta输出之后再输出一个空行
echo
done > ./temp/total.fasta
cat ./temp/total.fasta | grep ">"
结果正常了
>1
>2
>3
网友评论