У меня есть несколько образцов с чтениями R1 и R2 в формате fastq.gz (эти файлы дополняют друг друга). Я хочу запустить параллельную параллельную работу BWA mem для всех файлов после завершения, каждый дополнительный файл R1 и R2 должен создать один файл sam. Прямо сейчас я делаю два файла sam из двух чтений
Это то, что я придумал, но он не делает то, что мне нужно.
for i in `find -maxdepth 2 -iname *fastq.gz -type f`; do
echo "bwa mem -t 12 /H.Sapiens/ucsc.hg19.fasta ${i}_R1_001.fastq.gz ${i}_R2_001.fastq.gz > ${i}_R1_R2.sam"
done
Когда он запускается, это выглядит так
bwa mem -t 12 /H.Sapiens/ucsc.hg19.fasta ./Sample_0747/0747_CGG_L001_R2_001.fastq.gz_R1_001.fastq.gz ./Sample_0747/0747_CGG_L001_R2_001.fastq.gz_R2_001.fastq.gz > ./Sample_0747/0747_CGG_L001_R2_001.fastq.gz_R1_R2.sam
bwa mem -t 12 H.Sapiens/ucsc.hg19.fasta ./Sample_0748/0748_CCA_L001_R1_001.fastq.gz_R1_001.fastq.gz ./Sample_0748/0748_CCA_L001_R1_001.fastq.gz_R2_001.fastq.gz > ./Sample_0748/0748_CCA_L001_R1_001.fastq.gz_R1_R2.sam
-bash-4.1$
Я понимаю, что проблема в названии, но как ее исправить? Большое спасибо
2 ответа
Пытаться
find -maxdepth 2 -iname \*fastq.gz -type f |
sed 's/_R[12]_001\.fastq\.gz$//' |
sort -u |
while IFS= read -r f; do
echo "bwa mem -t 12 /H.Sapiens/ucsc.hg19.fasta \"${f}_R1_001.fastq.gz\" \"${f}_R2_001.fastq.gz\" > \"${f}_R1_R2.sam\""
done
Не перебирайте значение, проанализированное таким образом *. Во-первых, ради здравого смысла поместите свой код в скрипт, например
cat > script < SCRIPT
for i; do
bwa mem -t 12 /H.Sapiens/ucsc.hg19.fasta "${i}_R"{1,2}_001.fastq.gz > "${i}_R1_R2.sam"
done
SCRIPT
chmod +x script
Затем либо используйте предикат -exec
, либо xargs
, например
find -maxdepth 2 -iname '*fastq.gz' -type f -exec ./script {} +
Или
find -maxdepth 2 -iname '*fastq.gz' -type f -print0 | xargs -0 ./script
* Там написано "синтаксический анализ ls
", но он применяется к синтаксическому анализу любой команды, предназначенной для потребления человеком. find
явно вызывается.
С другой стороны, если вы не заключите в кавычки свои аргументы для find
, оболочка может интерпретировать их как глобусы.
find -iname *fastq.gz
Может расшириться до
find -iname foofastq.gz barfastq.gz bazfastq.gz
Вы хотите
find -iname '*fastq.gz'
Похожие вопросы
Новые вопросы
bash
Этот тег предназначен для вопросов о сценариях, написанных для командной оболочки Bash. Сценарии оболочки с синтаксисом или другими ошибками, пожалуйста, проверьте их на https://shellcheck.net, прежде чем публиковать здесь. Вопросы об интерактивном использовании Bash, скорее всего, будут актуальны на Unix & Linux Stack Exchange или Super User, чем на Stack Overflow.