美文网首页生物信息学与算法
cat *.fa 合并fasta文件的坑

cat *.fa 合并fasta文件的坑

作者: 白菜代码小推车 | 来源:发表于2019-04-02 17:21 被阅读10次

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

相关文章

网友评论

    本文标题:cat *.fa 合并fasta文件的坑

    本文链接:https://www.haomeiwen.com/subject/vbagbqtx.html