在分叉的 shell 中,我尝试运行一个接受两个输入文件并输出四个文件的代码。这是我尝试在 for 循环中执行的示例 - 它确实产生了我期望的结果:
sudo java -jar ~/Trimmomatic-0.36/trimmomatic-0.36.jar PE -phred33 \
my_dir/sample_1/77504_S11_L003_R1_001.fastq.gz \
my_dir/sample_1/77504_S11_L003_R2_001.fastq.gz \
my_dir/sample_1/77504_S11_L003_PE1_001_Adapter_Removed.fastq.gz \
my_dir/sample_1/77504_S11_L003_PE1_001_Adapter_Removed_U.fastq.gz \
my_dir/sample_1/77504_S11_L003_PE2_001_Adapter_Removed.fastq.gz \
my_dir/sample_1/776504_S11_L003_PE2_001_Adapter_Removed_U.fastq.gz \
ILLUMINACLIP:~/Trimmomatic-0.36/adapters/TruSeq3-PE.fa:2:30:10 \
LEADING:3 TRAILING:3 SLIDINGWINDOW:4:15 MINLEN:36
虽然我的所有输入文件都位于同一目录中,并且每对输入都位于同一子目录中,但没有两对单独的输入位于同一子目录中,例如
Pair 1:
my_dir/sample_1/77504_S11_L003_R1_001.fastq.gz
my_dir/sample_1/77504_S11_L003_R2_001.fastq.gz
Pair 2:
my_dir/sample_2/77505_S11_L003_R1_001.fastq.gz
my_dir/sample_2/77505_S11_L003_R2_001.fastq.gz
我需要在第一个块中针对大约 50 个文件运行我的代码。这是我到目前为止所得到的,但我知道它不正确,因为代码没有找到适配器
ILLUMINACLIP:~/Trimmomatic-0.36/adapters/TruSeq3-PE.fa:2:30:10
同样,这行代码在我发布的第一块代码中运行良好。
AdapterQCTrim () {
# Make base1
base=$(basename $filename .fastq.gz)
echo $base
# Make base2
baseR2=${base/_R1_/_R2_}
echo $baseR2
# Run Trimmomatic
sudo java -jar ~/Trimmomatic-0.36/trimmomatic-0.36.jar PE -phred33 \
${base}.fastq.gz \
${baseR2}.fastq.gz \
${base}.qc.fq.gz \
s1_UP \
${baseR2}.qc.fq.gz \
s2_UP \
ILLUMINACLIP:~/Trimmomatic-0.36/adapters/TruSeq3-PE.fa:2:30:10 \
LEADING:3 TRAILING:3 SLIDINGWINDOW:4:15 MINLEN:36
# Save
gzip -11c s1_UP s2_PE >> paired.qc.fq.gz
gzip -11c s1_UP s2_UP >> orphans.qc.fq.gz
}
for filename in *_R1_*.fastq.gz; do AdapterQCTrim & done
如果有办法简化这个过程,我愿意接受其他想法。
答案1
您的代码看起来不错,但只有一行。
for filename in *_R1_*.fastq.gz; do AdapterQCTrim & done
这里*_R1_*
不会展开成你所期望的。在您编写时,这些对位于不同的目录中,因此要将函数应用于子文件夹,您需要*/_R1_*.fastq.gz
在for
结构中。注意斜杠。您应该在包含子文件夹的位置执行此操作。您可以通过在for
循环之前添加如下内容来确保发生这种情况:
cd theRightDirectory || exit 1
for
顺便说一句,不是分叉的。它是在主进程中执行的。