concatenando múltiplos arquivos fastq

2

Eu tenho uma pasta com quase 100 arquivos, organizados em grupos de 16 arquivos cada. Eu preciso concatenar cada um dos 16 arquivos de cada grupo em um único arquivo. Por exemplo, um grupo de nomes de arquivos é:

randomString_$groupName- 

Eu tenho uma pasta com quase 100 amostras, a amostra é executada no Nextseq500 e é de encordoamento simples. Cada amostra é executada em 4 células de fluxo para o Nextseq500 com 4 faixas. Por exemplo, 16 arquivos fastq são gerados (veja o exemplo abaixo). Agora quero concatenar todos esses arquivos e gerar uma saída com o nome 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

Todos os arquivos acima devem ser concatenados em um único arquivo chamado 102697-001-001_R1.fastq.gz (portanto, manter a string entre os dois primeiros _ e após o último _ como nome).

Eu tentei:

$ 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

e funciona, mas como tenho muitos arquivos, não quero fazer manualmente.

    
por H.K 26.09.2017 / 10:03

1 resposta

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

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

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

Isso iterará todos os arquivos Fastq compactados no diretório atual e extrairá o nome da amostra na variável sample da shell. Para todos os nomes de arquivos mostrados na pergunta, isso seria 102697-001-001 .

A variável rnum conterá o bit R# no final do nome do arquivo.

O nome da amostra é extraído com o nome do arquivo e primeiro removendo tudo até e incluindo o primeiro caractere _ e, em seguida, removendo tudo após incluir o primeiro caractere _ desse resultado. O valor da variável rnum é extraído de maneira semelhante.

O arquivo é então anexado ao final do arquivo agregado usando cat >> . O nome do arquivo de saída será construído a partir do nome da amostra, o R# e a string .fastq.gz . Para os arquivos mostrados, isso será 102697-001-001_R1.fastq.gz .

Os arquivos compactados do Gzip não precisam ser descompactados para concatená-los. Descompactar o arquivo resultante lhe dará a concatenação descompactada de todos os arquivos Fastq.

Uma maneira alternativa de fazer isso com bash , usando uma expressão regular para descobrir o nome do arquivo de saída:

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

O nome do arquivo é comparado com a expressão regular

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

Os dois grupos (bits entre parênteses) selecionam as partes relevantes do nome do arquivo para nós. O primeiro grupo captura uma string que somente consiste em caracteres que são dígitos ou traços. Esse grupo precisa estar cercado por _ em ambos os lados. O único lugar no nome do arquivo que este bit corresponde é o nome da amostra.

Após o primeiro grupo e o _ após, permitimos qualquer número de caracteres ( .* ) até o (..)\.fastq\.gz bit. O \.fastq\.gz corresponderá à sequência .fastq.gz no final do nome do arquivo, portanto, o último grupo, (..) , captura R1 imediatamente antes disso (o padrão . corresponderá a qualquer caractere, enquanto \. irá corresponder a um ponto).

Os dois grupos capturados são armazenados como índice 1 e 2 na matriz BASH_REMATCH (o nome é a abreviação de "Bash Regular Expression Match") e usamos isso na construção do nome do arquivo de saída.

    
por 26.09.2017 / 10:31