我又来了!我想优化我的bash脚本,以减少每个循环所花费的时间。基本上,它所做的是:
。
我的问题是: 1)这些文件是60 to的压缩文件:我需要一个软件来解压缩它(实际上我现在正在尝试解压缩它,不确定我是否有足够的空间)--无论如何,要查看它是很长的
我改进它的想法:
parallel -j 0 ./extract_awk_reads_in_bam.sh ::: reads_id_and_pos.tsv并行解压缩文件之后退出awk
下面是我的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非常感谢++
发布于 2020-02-21 13:27:48
TL;DR
您的新脚本将是:
#!/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"}}'您正在读取每个输入的整个文件。最好同时把它们都找出来。从提取有趣的读取开始,然后在这个子集上应用第二个转换。
samtools view -@ 2 "$bam" | grep -f <(awk -F$'\t' '{print $1}' "$1") > "$sam"在这里,您将获得使用samtools读取的所有数据,并搜索grep的-f参数中出现的所有术语。该参数是包含搜索输入文件的第一列的文件。输出是一个sam文件,仅包含搜索输入文件中列出的读取。
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)
我之所以提出这个模式,是因为我觉得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。
在任何情况下,您都需要多次重新读取文件,或者在使用它之前对其进行解压缩。
https://stackoverflow.com/questions/60337568
复制相似问题