fork for 循环时出错?

fork for 循环时出错?

在分叉的 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.gzfor结构中。注意斜杠。您应该在包含子文件夹的位置执行此操作。您可以通过在for循环之前添加如下内容来确保发生这种情况:

cd theRightDirectory || exit 1

for顺便说一句,不是分叉的。它是在主进程中执行的。

相关内容