GNU 并行:通过 id 并行文件

GNU parallel: parallel files by id

我想并行化一个脚本。我知道 bite gnu-parallel,但也许它并不适合我的问题。 我有几个 GFF 输入文件(列由表格分隔),我想为我的脚本并行化它们。所有文件都包含相同的 ID。

File 1 :
id1 ...
id2 ...
id2 ...
id3 ...

File 2 :
id2 ...
id3 ...
id3 ...

两个文件不同:行数不一样,id 相同但不一定到处都存在(我找到这个答案 How to make gnu-parallel split multiple input files,但所有输入的行数都相同文件)。我不想连接它们,因为我想保留它们来自哪个数据集的信息。而且我不想更改 GFF 格式。 目前,我正在按 id 和 运行ning 我的脚本拆分我的文件。我需要将所有 id1 放在一起(id2 放在一起,等等),但我的脚本可以同时使用多个 id。而且我不需要 运行 File1 id1 - File2 id2 的组合,只需 File1 id1,File1 id2 - File2 id2 等。有时一个 id 没有很多数据,它可以 运行 与其他ids(运行1:文件 1 id1,文件 1 id2 - 文件 2 id2;运行2:文件 1 id3 - 文件 2 id3,等等)。那么是否可以通过根据每个组的 id 和数据量进行分组来有效地拆分我的输入数据?

谢谢

从你的问题来看,真的很难理解你想做什么。如果我弄错了,请向我们展示您期望的示例 运行.

我假设您的程序从 stdin 读取并且您希望将 ID 分组,因此您可以在一个 运行 中获得所有 id1,并且不要将一个组分成多个调用。

我的建议是合并 File1 和 File2,在每个 ID 组之前插入一个标记,让 GNU Parallel 读取一个块使用标记作为记录分隔符,删除记录分隔符并将其传递给 yourprog:

如果 File1+File2 已排序:

sort -m File1.gff File2.gff |

如果没有:

sort File1.gff File2.gff |

插入标记:

perl -pe '/^([^\t]+)/; if( ne $l) { print "Ma\rke\r"; } $l=;' |

寻找 Ma\rke\r,分成 10MB 的块,删除标记,传递给 yourprog:

parallel --pipe --recstart 'Ma\rke\r' --rrs --block 10M yourprog

自 20190222 起您可以使用 --shard:

cat *gff | parallel --shard 1 -j8 yourprog

这将查看第 1 列,计算哈希值,并根据哈希值模 8 将其发送到 yourprog 的实例。