我正在嘗試在多組 fasta.gz 檔案上運行程式 Unicycler。每個程式集都需要一組三個 fasta.gz 檔案,每組三個 fasta.gz 檔案都有一個公共 ID,它們位于一個唯一的子目錄中(名稱中包含相同的對應公共 ID)。
例如,三個檔案:QC_141696.fastq.gz、QC_141696_1.fastq.gz、QC_141696_2.fastq.gz 是運行程式集所必需的,它們位于子目錄 assem_141696 中。我還有 10 組以相同方式組織的 3 個檔案;所有 11 個名為 assem_(ID) 的子目錄都位于父目錄 Assemblies 中。
Sequencing/Assemblies/assem_(IDset1)/QC_(IDset1).fastq.gz
Sequencing/Assemblies/assem_(IDset1)/QC_(IDset1)_1.fastq.gz
Sequencing/Assemblies/assem_(IDset1)/QC_(IDset1)_2.fastq.gz
我試圖運行的命令的一個示例,而不是在回圈中是:
unicycler --short1 QC_141696.fastq.gz --short2 QC_141696_2.fastq.gz --long QC_141696.fastq.gz --out QC_141696_hybrid --threads 16
我想遍歷每個 assem_(IDset*) 子目錄并使用其中的三個檔案運行 Unicycler,輸出目錄應位于相關的 assem_(IDset*) 子目錄中
這是我到目前為止的代碼:
for file in Assemblies/assem*/*_1.fastq.gz;
do base=$(basename ${file} _1.fastq.gz)
echo "running unicycler hybrid assembly on ${base}"
unicycler --short1 ${base}_1.fastq.gz --short2 ${base}_2.fastq.gz --long ${base}.fastq.gz --out ${base}_hybridassem --threads 16
echo "unicycler assembly on ${base} finished"
done
我正在從 Sequencing 目錄中運行代碼
但我得到:
Error: could not find home/user/scratch/Sequencing/QC_181651_1.fastq.gz
所以看來我的代碼沒有回圈通過預期的目錄。令人討厭的是,它在使用 echo 測驗時作業正常。
任何幫助將不勝感激!
uj5u.com熱心網友回復:
您在Sequencing目錄中運行的代碼將需要為每個 assem_(IDset*) 子目錄構建輸入和輸出檔案的路徑。您可以使用 bash 引數擴展dir=${file%\/*}來提取回圈中的目錄。(另請注意,該base變數已重命名為id):
#!/bin/bash
for file in Assemblies/assem*/*_1.fastq.gz ; do
id=$(basename "${file}" _1.fastq.gz)
dir=${file%\/*}
echo "running unicycler hybrid assembly on ${id}"
unicycler --short1 "${dir}/${id}_1.fastq.gz" --short2 "${dir}/${id}_2.fastq.gz" --long "${dir}/${id}.fastq.gz" --out "${dir}/${id}_hybridassem" --threads 16
echo "unicycler assembly on ${id} finished"
done
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/522530.html
標籤:重击循环目录嵌套循环
上一篇:Angular用名稱和值迭代物件
