объединить команды, используя цикл - PullRequest
0 голосов
/ 08 марта 2019

Я хочу выполнить выравнивание, используя Hisat2 для несимметричных тысяч сэмплов и каждого сэмпла, распределенного по разным библиотекам.

Я изменил этот скрипт (https://www.biostars.org/p/223404/#224169):

#!/bin/bash
for f in `ls data/1547_2015/Accessions/Alst-1_6989/transcriptome/fastq/trim/*.fastq.bz2_trimmed.fq.gz | sed 's/.fastq.bz2_trimmed.fq.gz//g' | sort -u`
do
echo HISAT/hisat2-2.1.0/hisat2 --p 8 --min-intronlen 60 --max-intronlen 6000 --dta -x Hisat2_index/arabidopsis -U ${f}.fastq.bz2_trimmed.fq.gz -S ${f}.bam
done

Это дает мне эхо как:

HISAT/hisat2-2.1.0/hisat2 --p 8 --min-intronlen 60 --max-intronlen 6000 --dta -x Hisat2_index/arabidopsis -U data/1547_2015/Accessions/Alst-1_6989/transcriptome/fastq/trim/SRR3460433.fastq.bz2_trimmed.fq.gz -S data/1547_2015/Accessions/Alst-1_6989/transcriptome/fastq/trim/SRR3460433.bam
HISAT/hisat2-2.1.0/hisat2 --p 8 --min-intronlen 60 --max-intronlen 6000 --dta -x Hisat2_index/arabidopsis -U data/1547_2015/Accessions/Alst-1_6989/transcriptome/fastq/trim/SRR3460434.fastq.bz2_trimmed.fq.gz -S data/1547_2015/Accessions/Alst-1_6989/transcriptome/fastq/trim/SRR3460434.bam
HISAT/hisat2-2.1.0/hisat2 --p 8 --min-intronlen 60 --max-intronlen 6000 --dta -x Hisat2_index/arabidopsis -U data/1547_2015/Accessions/Alst-1_6989/transcriptome/fastq/trim/SRR3460435.fastq.bz2_trimmed.fq.gz -S data/1547_2015/Accessions/Alst-1_6989/transcriptome/fastq/trim/SRR3460435.bam
HISAT/hisat2-2.1.0/hisat2 --p 8 --min-intronlen 60 --max-intronlen 6000 --dta -x Hisat2_index/arabidopsis -U data/1547_2015/Accessions/Alst-1_6989/transcriptome/fastq/trim/SRR3460436.fastq.bz2_trimmed.fq.gz -S data/1547_2015/Accessions/Alst-1_6989/transcriptome/fastq/trim/SRR3460436.bam

Поскольку этот же образец ( Alst-1_6989 ) распределен по разным линиям ( SRR3460433, SRR3460434, SRR3460435, SRR3460436 ), которые должны быть объединены запятой, а не отдельным введите следующую команду, и я хочу получить имя образца ( Alst-1_6989 ) в выходном файле ( Alst-1_6989.bam ), в настоящее время это имя распределенной библиотеки. Это всего лишь один пример, у меня есть тысячи примеров с переменным числом распределенных библиотек, , поэтому мы должны помнить об этом.

HISAT/hisat2-2.1.0/hisat2 --p 8 --min-intronlen 60 --max-intronlen 6000 --dta -x Hisat2_index/arabidopsis -U data/1547_2015/Accessions/Alst-1_6989/transcriptome/fastq/trim/SRR3460433.fastq.bz2_trimmed.fq.gz,data/1547_2015/Accessions/Alst-1_6989/transcriptome/fastq/trim/SRR3460434.fastq.bz2_trimmed.fq.gz,data/1547_2015/Accessions/Alst-1_6989/transcriptome/fastq/trim/SRR3460435.fastq.bz2_trimmed.fq.gz,data/1547_2015/Accessions/Alst-1_6989/transcriptome/fastq/trim/SRR3460436.fastq.bz2_trimmed.fq.gz -S data/1547_2015/Accessions/Alst-1_6989/transcriptome/fastq/trim/Alst-1_6989.bam

Я думаю, что некоторые neseted for loop могут работать или что-то вроде этого, Любая помощь будет высоко ценится.

1 Ответ

1 голос
/ 08 марта 2019

Не разбирайте ls .

Имена файлов полного пути не должны быть дуплексными, поэтому я отбросил sort.
Я собираюсь предположить разумное количество файлов на образец.
Для этого -

base="$PWD"
cmdtrunk="HISAT/hisat2-2.1.0/hisat2 --p 8 --min-intronlen 60 --max-intronlen 6000 --dta -x Hisat2_index/arabidopsis -U "
shopt -s nullglob                         # return empty if not matched
for sample in data/1547_2015/Accessions/* # assumes no spaces, etc
do [[ -d "$base/$sample" ]] || continue   # ignore files in this dir
   lst=( $( find "$base/$sample/transcriptome/fastq/trim/" -name \*.fastq.bz2_trimmed.fq.gz -print0 |
       while read -r -d '' f; do printf "%s\n" "$f"; done ) ) 
   if (( ${#lst[@]} ))
   then stack="$( printf "%s," "${lst[@]}" )"
        printf " %s\n" "$cmdtrunk ${stack%,} -S $base/$sample/${sample##*/}.bam"
   fi
done

У меня нет ничего похожего на эту структуру, поэтому я не проверял это столько, сколько хотел бы. Тем не менее, все, что он делает, это печатает команды, которые вы можете сохранить и проверить перед выполнением.

Дайте мне знать, что сломалось, и мы исправим это.

...