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

Logo

更多推荐