如何遍历多个文件夹以连接 FastQ 文件?
How to loop over multiple folders to concatenate FastQ files?
我从 Illumina Sequencing 收到了 100 个样本的多个 fastq.gz 文件。但是根据样本 ID,各个样本的所有 fastq.gz 文件都位于单独的文件夹中。此外,对于一个示例,我有多个 (8-16) R1.fastq.gz
和 R2.fastq.gz
文件。因此,我使用以下代码将所有 R1.fastq.gz
和 R2.fastq.gz
连接成一个 R1.fastq.gz
和 R2.fastq.gz
.
cat V350043117_L04_some_digits-525_1.fq.gz V350043117_L04_some_digits-525_1.fq.gz V350043117_L04_some_digits-525_1.fq.gz > sample_R1.fq.gz
所以在排序文件中,代码中的结构如上。对于每个样本,带有 V
的字符串具有不同的数字,然后 L
具有不同的数字,然后是 _1
和 _2
之前的另一串数字。对于每个样本,数字都在不断变化。
我的问题是,如何创建一个循环,一次遍历所有文件夹,同时考虑序列文件的不同文件编号,以连接多个 fq.gz
文件并将它们组合成一个 R1 和 R2 文件?
当然,我不能通过进入每个示例文件夹来一个接一个地连接起来。
请提供一些有用的提示。谢谢。
文件夹结构如下:
/data/Sample_1/....._525_1_fq.gz /....._525_2_fq.gz /....._526_1_fq.gz /....._526_2_fq.gz
/data/Sample_2/....._580_1_fq.gz /....._580_2_fq.gz /....._589_1_fq.gz /....._589_2_fq.gz
/data/Sample_3/....._690_1_fq.gz /....._690_2_fq.gz /....._645_1_fq.gz /....._645_2_fq.gz
下面我附上了文件夹结构的截图。
Folder structure
根据提供的文件结构,请试一试:
#!/bin/bash
for d in Raw2/C*/; do
(
cd "$d"
id=${d%/}; id=${id##*/} # extract ID from the directory name
cat V*_1.fq.gz > "${id}_R1.fq.gz"
cat V*_2.fq.gz > "${id}_R2.fq.gz"
)
done
- 语法
for d in Raw2/C*/
遍历以 C
开头的子目录。
- 括号使内部命令在子 shell 中执行,因此我们不必关心从
cd "$d"
返回(以少量额外执行时间为代价)。
- 变量
id
赋值给从目录名中提取的ID。
例如cat V*_1.fq.gz
,会根据目录下的文件展开为V350028825_L04_581_1.fq.gz V350028825_L04_582_1.fq.gz
V350028825_L04_583_1.fq.gz
...,拼接成${id}_R1.fastq.gz
。 ${id}_R2.fastq.gz
. 相同
我从 Illumina Sequencing 收到了 100 个样本的多个 fastq.gz 文件。但是根据样本 ID,各个样本的所有 fastq.gz 文件都位于单独的文件夹中。此外,对于一个示例,我有多个 (8-16) R1.fastq.gz
和 R2.fastq.gz
文件。因此,我使用以下代码将所有 R1.fastq.gz
和 R2.fastq.gz
连接成一个 R1.fastq.gz
和 R2.fastq.gz
.
cat V350043117_L04_some_digits-525_1.fq.gz V350043117_L04_some_digits-525_1.fq.gz V350043117_L04_some_digits-525_1.fq.gz > sample_R1.fq.gz
所以在排序文件中,代码中的结构如上。对于每个样本,带有 V
的字符串具有不同的数字,然后 L
具有不同的数字,然后是 _1
和 _2
之前的另一串数字。对于每个样本,数字都在不断变化。
我的问题是,如何创建一个循环,一次遍历所有文件夹,同时考虑序列文件的不同文件编号,以连接多个 fq.gz
文件并将它们组合成一个 R1 和 R2 文件?
当然,我不能通过进入每个示例文件夹来一个接一个地连接起来。
请提供一些有用的提示。谢谢。
文件夹结构如下:
/data/Sample_1/....._525_1_fq.gz /....._525_2_fq.gz /....._526_1_fq.gz /....._526_2_fq.gz
/data/Sample_2/....._580_1_fq.gz /....._580_2_fq.gz /....._589_1_fq.gz /....._589_2_fq.gz
/data/Sample_3/....._690_1_fq.gz /....._690_2_fq.gz /....._645_1_fq.gz /....._645_2_fq.gz
下面我附上了文件夹结构的截图。
Folder structure
根据提供的文件结构,请试一试:
#!/bin/bash
for d in Raw2/C*/; do
(
cd "$d"
id=${d%/}; id=${id##*/} # extract ID from the directory name
cat V*_1.fq.gz > "${id}_R1.fq.gz"
cat V*_2.fq.gz > "${id}_R2.fq.gz"
)
done
- 语法
for d in Raw2/C*/
遍历以C
开头的子目录。 - 括号使内部命令在子 shell 中执行,因此我们不必关心从
cd "$d"
返回(以少量额外执行时间为代价)。 - 变量
id
赋值给从目录名中提取的ID。
例如 cat V*_1.fq.gz
,会根据目录下的文件展开为V350028825_L04_581_1.fq.gz V350028825_L04_582_1.fq.gz
V350028825_L04_583_1.fq.gz
...,拼接成${id}_R1.fastq.gz
。${id}_R2.fastq.gz
. 相同