【发布时间】:2017-03-28 12:25:57
【问题描述】:
我有一个包含超过 1 亿行的大型文本文件,名为 reads.fastq。此外,我还有另一个名为takeThese.txt 的文件,其中包含文件reads.fastq 中应该打印的行号(每行一个)。
目前我使用
awk 'FNR == NR { h[$1]; next } (FNR in h)' takeThese.txt reads.fastq > subsample.fastq
显然这需要很长时间。有没有办法使用存储在另一个文件中的行号从文本文件中提取行?如果对takeThese.txt 文件进行排序,它会加快速度吗?
编辑:
我拥有的文件的几行示例:
reads.fastq:
@HWI-1KL157:36:C2468ACXX
TGTTCAGTTTCTTCGTTCTTTTTTTGGAC
+
@@@DDDDDFF>FFGGC@F?HDHIHIFIGG
@HWI-1KL157:36:C2468ACXX
CGAGGCGGTGACGGAGAGGGGGGAGACGC
+
BCCFFFFFHHHHHIGHHIHIJJDDBBDDD
@HWI-1KL157:36:C2468ACXX
TCATATTTTCTGATTTCTCCGTCACTCAA
takeThese.txt:
5
6
7
8
所以输出看起来像这样:
@HWI-1KL157:36:C2468ACXX
CGAGGCGGTGACGGAGAGGGGGGAGACGC
+
BCCFFFFFHHHHHIGHHIHIJJDDBBDDD
编辑:建议脚本的比较:
$ time perl AndreasWederbrand.pl takeThese.txt reads.fastq > /dev/null
real 0m1.928s
user 0m0.819s
sys 0m1.100s
$ time ./karakfa takeThese_numbered.txt reads_numbered.fastq > /dev/null
real 0m8.334s
user 0m9.973s
sys 0m0.226s
$ time ./EdMorton takeThese.txt reads.fastq > /dev/null
real 0m0.695s
user 0m0.553s
sys 0m0.130s
$ time ./ABrothers takeThese.txt reads.fastq > /dev/null
real 0m1.870s
user 0m1.676s
sys 0m0.186s
$ time ./GlenJackman takeThese.txt reads.fastq > /dev/null
real 0m1.414s
user 0m1.277s
sys 0m0.147s
$ time ./DanielFischer takeThese.txt reads.fastq > /dev/null
real 0m1.893s
user 0m1.744s
sys 0m0.138s
感谢所有建议和努力!
【问题讨论】:
-
问题是,该答案中提供的解决方案也相当慢。如果没有比这更快的东西,那么这个问题肯定是重复的,对不起 - 我什至没有找到那个线程。
-
该脚本似乎输出相反的内容,即。文件
takeThese.txt中未列出的行。对于reads.fastq中的 100M 行(仅作为数据的行号)和takeThat.txt中均匀分布的 1M 行号,我的迷你笔记本电脑上的执行时间为 52 秒(>/dev/null)。我认为值得一提的是@glennjackman 的解决方案只用了 18 秒。 -
我用
awk 'BEGIN {for(i=1;i<=100000000;i++) print i}' > reads.fastq和awk 'BEGIN {for(i=1;i<=1000000;i++) print i*100}' > takeThat.txt生成了我的测试文件,顺便说一句,所以它是1000000 个均匀分布的命中。 -
感谢所有提出方法的人!我比较了较小子集的相应时间。我添加到问题中的结果。