用并行分割Fasta文件

时间:2017-09-27 12:48:41

标签: split parallel-processing fasta gnu-parallel fastq

我有一个很长的Fasta文件(来自已处理的Fastq文件),我需要将其拆分成较小的文件。我尝试使用并行方式,但我不知道该怎么做。我需要将Fasta文件拆分为较小的文件,每个文件的最大大小为700Mb。我的目标是将每个文件保存为{n} .faa,其序列号为n(01.faa,02.faa,03.faa,04.faa ... 10.faa,11.faa,12.faa。 .. n.faa),每个都有大致相同的大小。就我读到并行而言,我认为这是我应该使用的:

parallel -a MyFile.fasta --block 700M --pipe-part --recend '\n' --recstart '>' {} > #.faa

但我有两个问题。首先,我如何使每个文件具有大致相同的大小,因此对于1500Mb的初始文件,我不会以两个700Mb文件和一个100Mb文件结束,而是三个500Mb文件?我对此有一个想法是计算所需文件的数量(原始文件大小/ 700,将其四舍五入),然后将原始大小除以所需文件的数量,并将数字舍入为整数,我有块大小(小于700Mb),所以我做这样的事情:

original_size=$(wc -c MyFile.fasta | sed 's/ .*//')  #get size
number=`expr $original_size / 734003200 + 1`
size=`expr $(wc -c MyFile.fasta) / $number`

有了这个,我可以获得每个文件应该具有的大小(以字节为单位),以获得具有相同大小的文件,但都低于700Mb。有没有更简单的方法只使用并行工具?

我应该怎么做才能将每​​个块保存在不同的文件中?是" {}> #.faa"接近正确吗?或者使用--cat会更有效率? 另外,我如何获得数字"#"每个都是两位数(01 ... 10)?

此外,如果它必须将文件拆分为12个较小的文件,但我的计算机只有8个核心,它将使用8个核心作为8个文件,并且当它完成作业运行其余4个作业时,或者我应该以某种方式限制我的工作到核心数量?

1 个答案:

答案 0 :(得分:0)

这将分成大约700 MB的文件(+ - 单个记录的大小)。它们将被命名为1..n:

parallel -a MyFile.fasta --block 700M --pipe-part --recend '\n' --recstart '>' "cat >{#}"

你不能轻易要求GNU Parallel将1500 MB变成3x500 MB而不是2x700 MB + 1x100MB。

但是你可以让GNU Parallel将文件分成每个作业槽的给定数量的文件。每个职位空间一个文件:

parallel -a MyFile.fasta --block -1 --pipe-part --recend '\n' --recstart '>' "cat >{#}"

每个职位空间有两个文件:

parallel -a MyFile.fasta --block -2 --pipe-part --recend '\n' --recstart '>' "cat >{#}"

作业点数以-j给出,默认为CPU核心数。

要将名称设为01..n,您必须用零填充它们。 GNU Parallel并不提供开箱即用的功能,但是在--rpl部分的手册页中,您将获得一个如何定义替换字符串的示例:

--rpl '{0#} $f=1+int("".(log(total_jobs())/log(10)));  $_=sprintf("%0${f}d",seq())'

所以:

parallel -a MyFile.fasta --block 700M --pipe-part --recend '\n' --recstart '>' \
  --rpl '{0#} $f=1+int("".(log(total_jobs())/log(10)));  $_=sprintf("%0${f}d",seq())' \
  "cat >{0#}"

如果您经常使用{0#},则只需将--rpl定义放在~/.parallel/config中即可。