并行拆分Fasta文件



我有一个长的fasta文件(来自处理后的fastq文件),我需要将其拆分为较小的文件。我正在尝试使用并行执行此操作,但我不确定如何。我需要将FASTA文件分为较小的文件,每个文件的最大大小为700MB。我的目标是将每个文件保存为{n} .faa,n(01.FAA,02.FAA,03.FAA,03.FAA,04.FAA ... FAA ... 10.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"方法正确吗?还是使用 - 猫会更有效?另外,如何使数字"#"为每个数字(01 ... 10)?

另外,如果它必须将文件拆分为12个较小的文件,但是我的计算机只有8个核核心数?

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

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

您不能轻易地要求GNU平行地将1500 MB变成3x500 MB而不是2x700 MB 1x100MB。

但是,您可以使GNU并行将文件拆分为每个Jobslot的给定数量的文件。每个乔布洛的一个文件:

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

每个jobslot的两个文件:

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

-j给出Jobslots的数量,默认为CPU内核数。

要使名称为01..n,您必须与零一起使用。GNU并行并不是开箱即用的,但是在--rpl的" MAN"页面中,您将为您提供一个如何定义替换字符串来执行此操作的示例:

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

so:

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中。

最新更新