优化查找大压缩文件的脚本

问题描述 投票:0回答:1

我又来了!我想优化我的bash脚本,以减少每个循环所花费的时间。基本上,它的作用是:-从电视获取信息-使用该信息以awk查找文件-打印行并导出它

我的问题是:1)这些文件是60GB的压缩文件:我需要一个软件来解压缩它(我实际上正在尝试解压缩它,不确定我是否有足够的空间)2)反正很长时间

我的改进建议:

  1. 0),如果可能,我将解压缩文件
  2. 使用与parallel -j 0 ./extract_awk_reads_in_bam.sh ::: reads_id_and_pos.tsv并行的GNU,但我不确定它是否按预期工作?我将每次研究的时间从36分钟减少到16分钟,所以只需2.5倍? (我有16个核心)

  3. 我当时在想(但对GNU来说可能是多余的?)我的信息列表,可查看多个文件以启动它们平行度

  4. 将bam文件按读取名称排序,并在找到2个匹配项(不能超过2个)

这是我的bash脚本的其余部分,我真的很乐于改进它,但是我不确定我是编程方面的超级明星,所以也许保持简单会有所帮助吗? :)

我的bash脚本:

#/!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文件的格式如下:

READ_ABCDEF\t1200

非常感谢++

bash bioinformatics gnu-parallel
1个回答
0
投票

您正在读取每个输入的整个文件。最好同时寻找所有这些对象。首先提取有趣的读物,然后对该子集应用第二个转换。

samtools view -@ 2 "$bam" | grep -f <(awk -F$'\t' '{print $1}' "$1") > "$sam"

在这里,您将获得samtools的所有读物,并搜索-fgrep参数中出现的所有术语。该参数是一个文件,其中包含搜索输入文件的第一列。输出为sam文件,仅包含搜索输入文件中列出的读数。

awk -v st="$1" 'BEGIN {OFS="\t"; while (getline < st) {st_array[$1]=$2}} {print $0, st_array[$1], "wh_genome"}' "$sam"

最后,使用awk添加其他信息:

  1. 以awk开头的搜索输入文件打开,并将其内容读入数组(st_array
  2. 将输出字段分隔符设置为制表符
  3. 遍历sam文件,并从预填充的数组中添加额外的信息。

我之所以提出这种模式,是因为我觉得grepawk更快,但使用awk可以得到相同的结果:

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

在任何情况下,您都需要多次读取该文件或对其进行解压缩,然后再使用它。

© www.soinside.com 2019 - 2024. All rights reserved.