首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否有可能“暂停”awk来执行一些其他命令而不会失去它在文件中的位置?

是否有可能“暂停”awk来执行一些其他命令而不会失去它在文件中的位置?
EN

Stack Overflow用户
提问于 2022-04-03 02:25:25
回答 1查看 63关注 0票数 1

我有23个压缩的基因数据文件,每行在380万到2400万行之间。每个文件有超过12,000列。我需要提取特定列中的变量高于某个值的行。

要做到这一点很容易,方法是将文件(我们称之为${HUGE_DATA_FILE})从zcat转到awk,然后将满足条件的行打印到最后被压缩的临时文件中。然而,可能有40%的行满足条件,临时文件变得巨大。如果我并行地尝试多个文件,非this临时文件将迅速占用所有可用内存。

我编写了一个用块处理文件的脚本:它读取100,000行数据,将适当的行提取到临时文件中,然后gzip将临时文件添加到输出文件中。输出是正确的,但到达那里是缓慢的。每次它开始循环来处理一个新的块(第6行)时,它就开始读取${HUGE_DATA_FILE},这似乎是在浪费时间。

代码语言:javascript
运行
复制
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

我的问题:

  1. 是否有一种方法可以“暂停”zcat \ awk,以执行第7-11行中的步骤,而不让zcat在文件开始时重新开始?例如,是否可以将第7-11行嵌入到awk语句中,以便在NR为100000?
  2. Besides的倍数时运行--这是制作大型临时文件的问题-- zcat对于这样大小的文件来说非常慢。然而,对于这23个大数据文件中的每一个,都有一个具有相同行数的信息文件。而不是12,000列,它只有几个列,其中一个有一个变量,用于确定从这个巨大的数据文件中提取哪些行。脚本可以非常快地读取这个信息文件,并记录需要从大型数据文件中提取的行号。是否有什么方法可以提取行,而不需要实际读取庞大的数据文件来查找行尾?(或者,至少有比zcat更快的读取文件的方法吗?)
  3. 还有其他聪明的方法来解决速度和临时文件大小的问题吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-03 03:18:09

只需这样做,而不是循环和临时文件:

代码语言:javascript
运行
复制
zcat "$HUGE_DATA_FILE" | awk 'whatever' | gzip -c > "${OUTPUT_FILE}.gz"

顺便提一下,在学习时,请阅读Correct Bash and shell script variable capitalizationhttps://mywiki.wooledge.org/Quotes,并将所有的shell脚本复制/粘贴到http://shellcheck.net中。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71722534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档