连接多个fastq文件

连接多个fastq文件

我有一个包含近 100 个文件的文件夹,每组 16 个文件。我需要将每组的 16 个文件连接成一个文件。例如,一组文件名是:

randomString_$groupName- 

我有一个包含近 100 个样本的文件夹,这些样本在 Nextseq500 上运行并且是单链的。每个样品在具有 4 个泳道的 Nextseq500 的 4 个 Flowcell 上运行。因此,每个样本会生成 16 个 fastq 文件(请参见下面的示例)。现在我想连接所有这些文件并生成一个具有名称的输出102697-001-001_R1.fastq.gz

HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L001_R1.fastq.gz
HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L002_R1.fastq.gz
HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L003_R1.fastq.gz
HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L004_R1.fastq.gz

HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L001_R1.fastq.gz
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L002_R1.fastq.gz
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L003_R1.fastq.gz
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L004_R1.fastq.gz

HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L001_R1.fastq.gz
HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L002_R1.fastq.gz
HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L003_R1.fastq.gz
HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L004_R1.fastq.gz

HJJMYBGXX_102697-001-001_ATTACTCG-GCCTCTAT_L001_R1.fastq.gz
HJJMYBGXX_102697-001-001_ATTACTCG-GCCTCTAT_L002_R1.fastq.gz
HJJMYBGXX_102697-001-001_ATTACTCG-GCCTCTAT_L003_R1.fastq.gz
HJJMYBGXX_102697-001-001_ATTACTCG-GCCTCTAT_L004_R1.fastq.gz

上面的所有文件都应该连接成一个名为的文件102697-001-001_R1.fastq.gz(因此保留两个文件之间的字符串_作为_名称)。

我努力了:

$ cat HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L001_R1.fastq.gz \
HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L002_R1.fastq.gz \
HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L003_R1.fastq.gz \
HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L004_R1.fastq.gz \
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L001_R1.fastq.gz \
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L002_R1.fastq.gz \
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L003_R1.fastq.gz \
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L004_R1.fastq.gz \
HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L001_R1.fastq.gz \
HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L002_R1.fastq.gz \
HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L003_R1.fastq.gz \
HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L002_R1.fastq.gz \
HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L003_R1.fastq.gz \
HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L004_R1.fastq.gz \
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L001_R1.fastq.gz \
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L002_R1.fastq.gz \
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L003_R1.fastq.gz \
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L004_R1.fastq.gz \
HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L001_R1.fastq.gz \
HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L002_R1.fastq.gz \
HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L003_R1.fastq.gz \
HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L004_R1.fastq.gz > 102697_001_001_R1.fastq.gz

它有效,但由于我有很多文件,我不想手动执行。

答案1

for name in ./*.fastq.gz; do
    rnum=${name##*_}
    rnum=${rnum%%.*}

    sample=${name#*_}
    sample=${sample%%_*}

    cat "$name" >>"${sample}_$rnum.fastq.gz"
done

这将迭代当前目录中的所有压缩 Fastq 文件并将样本名称提取到 shell 变量中sample。对于问题中显示的所有文件名,这将是102697-001-001.

rnum变量将保存R#文件名末尾的位。

通过获取文件名并首先删除第一个字符之前的所有内容(包括第一个_字符),然后_从结果中删除第一个字符之后的所有内容(包括第一个字符)来提取样本名称。rnum以类似的方式提取变量的值。

然后使用 将该文件简单地附加到聚合文件的末尾cat >>。输出文件名将由样本名称R#、 和字符串构成.fastq.gz。对于显示的文件,这将是102697-001-001_R1.fastq.gz.

Gzip 压缩文件不必解压缩即可连接它们。解压缩生成的文件将为您提供所有 Fastq 文件的未压缩串联。


bash使用正则表达式来计算输出文件名的另一种方法是:

for name in ./*.fastq.gz; do
    if [[ "$name" =~ _([0-9-]+)_.*(..)\.fastq\.gz ]]; then
        outfile="${BASH_REMATCH[1]}_${BASH_REMATCH[2]}.fastq.gz"

        cat "$name" >>"$outfile"
    fi
done

文件名与正则表达式匹配

_([0-9-]+)_.*(..)\.fastq\.gz

这两个组(括号中的位)将为我们挑选出文件名的相关部分。第一组捕获一个字符串仅有的由数字或短划线字符组成。该小组需要从_两侧包围。文件名中该位唯一匹配的位置是样本名称。

在第一组之后以及_之后的组之后,我们允许任意数量的任意字符 ( .*) 直至该(..)\.fastq\.gz位。将\.fastq\.gz匹配.fastq.gz文件名末尾的字符串,因此最后一组(..)捕获紧接R1其之前的字符串(该.模式将匹配任何一个字符,而\.将匹配一个点)。

捕获的两个组作为索引 1 和 2 存储在数组中BASH_REMATCH(名称是“Bash 正则表达式匹配”的缩写),我们使用它们来构造输出文件名。

答案2

我必须为我的工作做一些非常相似的事情。

对我来说最干净的解决方案如下:

ls *.fastq.gz | cut -d '_' -f2 | sort | uniq | parallel -j 16 'cat *{}*.fastq.gz > {}_R1.fastq.gz'

在这段代码中我:

  1. 查找所有具有.fastq.gz扩展名的文件。 **文件名不允许包含特殊字符(例如,!?' ')。请参阅 adminbee 对我的评论的回复。
  2. cut(1) 的输出按分隔符保存_并保存第二个输出 ( -f2)
  3. sort文本cut
  4. 仅保留唯一的(即uniq)文本
  5. 将唯一文本发送至parallel.
  6. parallel启动多达 16 个职位 ( -j 16)
  7. 每个并行作业运行命令
    'cat *{}*.fastq.gz > {}_R1.fastq.gz'
    
    此代码应连接它在代码运行的目录中cat找到的与输入 ( {})匹配的所有文件。uniq它将调用输出文件:102697-001-001_R1.fastq.gz.

我知道它不会自动捕获R1.也许有人可以建议一种R1在我的代码中捕获的方法?

这段代码的伟大之处在于它执行此任务的目的是全部目录中的独特示例。我有来自 16 个样本的 32 个文件(即,Sample1_L001.fastqSample1_L002.fastqSample2_L001Sample2_L002;等等...)。这段代码一次性将它们全部通过样本连接起来。所以我最终得到了Sample1.fastq, Sample2.fastq, 等等。

相关内容