我又来了!我想优化我的bash脚本,以减少每个循环所花费的时间。基本上,它的作用是:-从电视获取信息-使用该信息以awk查找文件-打印行并导出它
我的问题是:1)这些文件是60GB的压缩文件:我需要一个软件来解压缩它(我实际上正在尝试解压缩它,不确定我是否有足够的空间)2)反正很长时间
我的改进建议:
使用与parallel -j 0
./extract_awk_reads_in_bam.sh ::: reads_id_and_pos.tsv
并行的GNU,但我不确定它是否按预期工作?我将每次研究的时间从36分钟减少到16分钟,所以只需2.5倍? (我有16个核心)
我当时在想(但对GNU来说可能是多余的?)我的信息列表,可查看多个文件以启动它们平行度
这是我的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
非常感谢++
您正在读取每个输入的整个文件。最好同时寻找所有这些对象。首先提取有趣的读物,然后对该子集应用第二个转换。
samtools view -@ 2 "$bam" | grep -f <(awk -F$'\t' '{print $1}' "$1") > "$sam"
在这里,您将获得samtools
的所有读物,并搜索-f
的grep
参数中出现的所有术语。该参数是一个文件,其中包含搜索输入文件的第一列。输出为sam
文件,仅包含搜索输入文件中列出的读数。
awk -v st="$1" 'BEGIN {OFS="\t"; while (getline < st) {st_array[$1]=$2}} {print $0, st_array[$1], "wh_genome"}' "$sam"
最后,使用awk添加其他信息:
st_array
)我之所以提出这种模式,是因为我觉得grep
比awk
更快,但使用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
。
在任何情况下,您都需要多次读取该文件或对其进行解压缩,然后再使用它。