Um comando de Bash para percorrer uma lista de arquivos em um diretório, find são números de réplicas 1-9 e concatena-los em um novo arquivo

0

Eu tenho um diretório com vários arquivos Ex:

ExperimentA_Rep1.bed
ExperimentA_Rep2.bed
ExperimentA_Rep3.bed
ExperimentB_Rep1.bed
ExperimentD_Rep1.bed
ExperimentC_Rep1.bed
ExperimentC_Rep2.bed
.
.
.
ExperimentZ_Rep5.bed

Eu preciso examinar os nomes dos arquivos em um diretório e concatenar os arquivos que são da mesma experiência, mas replicações diferentes, em um novo arquivo.

Ou seja

cat ExperimentA_Rep1.bed ExperimentA_Rep2.bed > ExperimentA_merged.bed

Se o Experimento tiver apenas 1 replicação, não deverá fazer nada. Mas não posso codificar isso, ele precisa ser aplicável a qualquer conjunto de dados de experimentos.

Se eu executasse um script python, tudo ficaria bem.

    
por Anonymous 18.10.2015 / 02:44

1 resposta

0

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
    
por 18.10.2015 / 02:59