首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化我的脚本,查找一个大的压缩文件

优化我的脚本,查找一个大的压缩文件
EN

Stack Overflow用户
提问于 2020-02-21 11:18:08
回答 1查看 90关注 0票数 2

我又来了!我想优化我的bash脚本,以减少每个循环所花费的时间。基本上,它所做的是:

  • 从tsv
  • 获取信息,使用该信息使用awk查找文件
  • 打印行并导出

我的问题是: 1)这些文件是60 to的压缩文件:我需要一个软件来解压缩它(实际上我现在正在尝试解压缩它,不确定我是否有足够的空间)--无论如何,要查看它是很长的

我改进它的想法:

  1. 0)如前所述,如果可能的话,我将使用GNU与parallel -j 0 ./extract_awk_reads_in_bam.sh ::: reads_id_and_pos.tsv并行解压缩文件
  2. ,但我不确定它是否如预期的那样工作?我把每次研究的时间从36分钟缩短到16分钟,所以只是2.5倍?(我有16个核心)
  3. ,我在想(但它可能对GNU来说是多余的?)要拆分我的信息列表,查看几个文件,以便并行启动
  4. ,根据读取的名称对bam文件进行排序,并在找到两个匹配(不能超过2)

之后退出awk

下面是我的bash脚本的其余部分,我对改进它的想法很开放,但我不确定我是编程方面的超级明星,所以也许保持简单会有帮助?:)

我的bash脚本:

代码语言:javascript
复制
#/!bin/bash
while IFS=$'\t' read -r READ_ID_WH POS_HOTSPOT; do
echo "$(date -Iseconds) read id is : ${READ_ID_WH} with position ${POS_HOTSPOT}" >> /data/bismark2/reads_done_so_far.txt
echo "$(date -Iseconds) read id is : ${READ_ID_WH} with position ${POS_HOTSPOT}"
samtools view -@ 2 /data/bismark2/aligned_on_nDNA/bamfile.bam | awk -v read_id="$READ_ID_WH" -v pos_hotspot="$POS_HOTSPOT" '$1==read_id {printf $0 "\t%s\twh_genome",pos_hotspot}'| head -2 >> /data/bismark2/export_reads_mapped.tsv
done <"$1"

我的tsv文件的格式如下:

代码语言:javascript
复制
READ_ABCDEF\t1200

非常感谢++

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-21 13:27:48

TL;DR

您的新脚本将是:

代码语言:javascript
复制
#!/bin/bash
samtools view -@ 2 /data/bismark2/aligned_on_nDNA/bamfile.bam | awk -v st="$1" 'BEGIN {OFS="\t"; while (getline < st) {st_array[$1]=$2}} {if ($1 in st_array) {print $0, st_array[$1], "wh_genome"}}'

您正在读取每个输入的整个文件。最好同时把它们都找出来。从提取有趣的读取开始,然后在这个子集上应用第二个转换。

代码语言:javascript
复制
samtools view -@ 2 "$bam" | grep -f <(awk -F$'\t' '{print $1}' "$1") > "$sam"

在这里,您将获得使用samtools读取的所有数据,并搜索grep-f参数中出现的所有术语。该参数是包含搜索输入文件的第一列的文件。输出是一个sam文件,仅包含搜索输入文件中列出的读取。

代码语言:javascript
复制
awk -v st="$1" 'BEGIN {OFS="\t"; while (getline < st) {st_array[$1]=$2}} {print $0, st_array[$1], "wh_genome"}' "$sam"

最后,使用awk添加额外信息:

首先用awk打开搜索输入文件,并将其内容读入数组(st_array)

  • Set中,将输出字段分隔器读入tabulator

  • Traverse ( sam文件),并从预先填充的数组中添加额外的信息。

我之所以提出这个模式,是因为我觉得grepawk做搜索要快,但是仅使用awk就可以获得相同的结果:

代码语言:javascript
复制
samtools view -@ 2 "$bam" | awk -v st="$1" 'BEGIN {OFS="\t"; while (getline < st) {st_array[$1]=$2}} {if ($1 in st_array) {print $0, st_array[$1], "wh_genome"}}'

在这种情况下,您只需要添加一个条件就可以识别有趣的读取并去掉grep

在任何情况下,您都需要多次重新读取文件,或者在使用它之前对其进行解压缩。

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

https://stackoverflow.com/questions/60337568

复制
相关文章

相似问题

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