Experimente este script de shell:
for f in *Rep1.bed
do
cat "${f%Rep1.bed}"*.bed >"$f.merged"
done
Como funciona
Cada experiência no seu exemplo tinha um arquivo cujo nome terminava em Rep1.bed
. Para encontrar todos os arquivos nessa experiência, podemos usar o glob ${f%Rep1.bed}"*.bed
. Esses arquivos são então concatenados em um único arquivo. Isso é repetido para cada experimento.
O formulário ${f%Rep1.bed}
é um exemplo de remoção de sufixo. Ele pega a variável f
e remove do final qualquer ocorrência do padrão que segue o sinal %
. Por exemplo, vamos criar uma variável de shell:
$ f=ExperimentC_Rep2.bed
$ echo "${f}"
ExperimentC_Rep2.bed
Agora, vamos remover .bed
do final:
$ echo "${f%.bed}"
ExperimentC_Rep2
Ou, como precisamos aqui, podemos remover uma string mais longa Rep2.bed
:
$ echo "${f%Rep2.bed}"
ExperimentC_
O que resta acima é o nome da experiência com o número do replicante removido. Podemos usar isso para selecionar todos os arquivos replicantes associados ao nome da experiência usando o glob "${f%Rep1.bed}"*.bed
Como uma única linha
Ao executar o código interativamente, às vezes é mais fácil executá-lo como uma única linha. O código acima, como uma única linha, é:
for f in *Rep1.bed; do cat "${f%Rep1.bed}"*.bed >"$f.merged"; done
Criando um arquivo mesclado apenas para experimentos com 2 ou mais replicantes
Algumas experiências têm apenas um replicante ( *_Rep1.bed
). Outros têm vários: _Rep1.bed
, _Rep2.bed
, .... Se quisermos selecionar apenas arquivos com dois ou mais, podemos selecionar apenas arquivos para os quais Rep2
existe:
for f in *Rep2.bed; do cat "${f%Rep2.bed}"*.bed >"$f.merged"; done