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
и ищете все термины, которые встречаются в -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 для добавления дополнительной информации:
- Открыть входной файл поиска с awk в начале и считайте его содержимое в массив (
st_array
) - Установите разделитель поля вывода на табулятор
- Перейдите в файл sam и добавьте дополнительную информацию из предварительно заполненного массива.
Я предлагаю эту схему, потому что я чувствую, что 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
.
В любом случае вам необходимо перечитать файл более одного раза или распакуйте его перед началом работы с ним.