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.