<p>取样是一种方法,但你得靠运气。另外,Python是执行此项工作的错误工具。您可以使用标准的Unix命令行工具,以仍然相当有效的方式执行不同的操作,并计算出准确的答案:</p>
<ol>
<li>线性化你的FASTQ记录:用制表符替换前三行中的新行。在</li>
<li>对一对线性化文件运行<code>diff</code>。如果存在差异,<code>diff</code>将报告它。在</li>
</ol>
<p>要线性化,可以通过<code>awk</code>运行FASTQ文件:</p>
<pre><code>$ awk '\
BEGIN { \
n = 0; \
} \
{ \
a[n % 4] = $0; \
if ((n+1) % 4 == 0) { \
print a[0]"\t"a[1]"\t"a[2]"\t"a[3]; \
} \
n++; \
}' example.fq > example.fq.linear
</code></pre>
<p>要比较一对文件:</p>
^{pr2}$
<p>如果有任何差异,<code>diff</code>将找到它并告诉您哪个FASTQ记录不同。在</p>
<p>{1}你可以直接在两个文件上进行线性化,但是如果你不做线性化的话,那你就可以直接在这两个文件上运行线性化了。在</p>
<p>所以这些是大文件。写入新文件在时间和磁盘空间上都很昂贵。有一种方法可以改进这一点,使用<a href="https://en.wikipedia.org/wiki/Standard_streams" rel="nofollow">streams</a>。在</p>
<p>如果将<code>awk</code>脚本放入一个文件(<em>例如,</em>,<code>linearize_fq.awk</code>),则可以这样运行它:</p>
<pre><code>$ awk -f linearize_fq.awk example.fq > example.fq.linear
</code></pre>
<p>这对您的100+Gb文件很有用,因为现在您可以通过<code>bash</code><a href="https://en.wikipedia.org/wiki/Process_substitution" rel="nofollow">process substitutions</a>设置两个Unix文件流,并直接在这些流上运行<code>diff</code>:</p>
<pre><code>$ diff <(awk -f linearize_fq.awk example_1.fq) <(awk -f linearize_fq.awk example_2.fq)
</code></pre>
<p>或者您可以使用<a href="https://en.wikipedia.org/wiki/Named_pipe" rel="nofollow">named pipes</a>:</p>
<pre><code>$ mkfifo example_1.fq.linear
$ mkfifo example_2.fq.linear
$ awk -f linearize_fq.awk example_1.fq > example_1.fq.linear &
$ awk -f linearize_fq.awk example_2.fq > example_2.fq.linear &
$ diff example_1.fq.linear example_2.fq.linear
$ rm example_1.fq.linear example_2.fq.linear
</code></pre>
<p>命名管道和进程替换都避免了创建额外(常规)文件的步骤,这对于您的输入可能是一个问题。将100+Gb文件的线性化副本写入磁盘可能需要一段时间,而且这些副本还可能占用您可能没有的磁盘空间。在</p>
<p>使用streams可以解决这两个问题,这使得它们对于以有效的方式处理生物信息学数据集非常有用。在</p>
<p>您可以用Python复制这些方法,但它几乎肯定会运行得慢得多,因为Python在处理像这样的重I/O任务时非常慢。在</p>