У меня есть несколько образцов с чтениями 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$

Я понимаю, что проблема в названии, но как ее исправить? Большое спасибо

1
ZenTangleRR 13 Мар 2015 в 23:26

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
1
glenn jackman 13 Мар 2015 в 20:44

Не перебирайте значение, проанализированное таким образом *. Во-первых, ради здравого смысла поместите свой код в скрипт, например

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'
1
kojiro 13 Мар 2015 в 20:41