我有23个压缩的基因数据文件,每行在380万到2400万行之间。每个文件有超过12,000列。我需要提取特定列中的变量高于某个值的行。
要做到这一点很容易,方法是将文件(我们称之为${HUGE_DATA_FILE})从zcat转到awk,然后将满足条件的行打印到最后被压缩的临时文件中。然而,可能有40%的行满足条件,临时文件变得巨大。如果我并行地尝试多个文件,非this临时文件将迅速占用所有可用内存。
我编写了一个用块处理文件的脚本:它读取100,000行数据,将适当的行提取到临时文件中,然后gzip将临时文件添加到输出文件中。输出是正确的,但到达那里是缓慢的。每次它开始循环来处理一个新的块(第6行)时,它就开始读取${HUGE_DATA_FILE},这似乎是在浪费时间。
1 BLOCK_SIZE=100000
2 START_CTR=1
3 END_CTR=$(( START_CTR + BLOCK_SIZE ))
4 while [ $START_CTR -lt $MAX_LINE ]
5 do
6 zcat ${HUGE_DATA_FILE} | tail -n +${START_CTR} | head -n ${BLOCK_SIZE} | awk -F'\t' '{ if($7 >= 0.4) print $0 }' >> ${TEMP_OUTPUT_FILE}
7 gzip ${TEMP_OUTPUT_FILE}
8 cat ${TEMP_OUTPUT_FILE}.gz >> ${OUTPUT_FILE}.gz
9 START_CTR=${END_CTR}
10 END_CTR=$(( START_CTR + BLOCK_SIZE ))
11 rm ${TEMP_OUTPUT_FILE}.gz
12 done
我的问题:
发布于 2022-04-03 03:18:09
只需这样做,而不是循环和临时文件:
zcat "$HUGE_DATA_FILE" | awk 'whatever' | gzip -c > "${OUTPUT_FILE}.gz"
顺便提一下,在学习时,请阅读Correct Bash and shell script variable capitalization和https://mywiki.wooledge.org/Quotes,并将所有的shell脚本复制/粘贴到http://shellcheck.net中。
https://stackoverflow.com/questions/71722534
复制相似问题