Como ler todos os subdiretórios e criar arquivos correspondentes no bash?

1

Eu tenho dois diretórios principais, A e B . Cada um deles contém 100 subdiretórios (a1, a2, .. e b1, b2, ...) com nome aleatório. Esses subdiretórios contêm um arquivo de XY type. O valor X é o mesmo para um subdiretório específico, digamos a1 e b1 , mas o valor Y é diferente. Agora posso criar um arquivo XY , em que Y será a diferença entre os subdiretórios Y somente, digamos Y = Y1(a1) - Y2(b1) com um simples comando awk ou algo assim. Mas eu não sei como fazer isso com um loop bash para todos os subdiretórios. O que eu quero um script desejado que criará diretórios 1, 2, .. onde cada diretório conterá um arquivo XY type e os arquivos XY type conterão X Y(a1-b1) no diretório 1, X Y(a2-b2) no diretório 2 , .., X Y(a100-b100) no direcotry 100. Sou bastante novo no bash então peça desculpas por qualquer questão trivial.

Exemplo esquemático pode ser assim: Eu tenho dois diretórios principais A e B . A tem subdiretórios 0.3427/ 0.3514/ 0.3543/ 0.3792/... e B tem subdiretórios 0.4011/ 0.4014/ 0.4031/ 0.4357/... .

O diretório

0.3427/ sub de A contém o arquivo de dados:

0.00 -8.79583
50.00 -8.79621
100.00 -8.79961
150.00 -8.80721
200.00 -8.81845
250.00 -8.83271
300.00 -8.8495
O diretório

e 0.4011 sub contém o arquivo de dados:

0.00 -8.78888
50.00 -8.78954
100.00 -8.79458
150.00 -8.80459
200.00 -8.81852
250.00 -8.83561
300.00 -8.85529

Agora eu quero no diretório 1 que deve haver um arquivo, digamos data.dat com os seguintes dados:

0.00 0.00695
50.00 0.00667
100.00 0.00503
150.00 0.00262
200.00 -7e-05
250.00 -0.0029
300.00 -0.00579

Este arquivo data.dat desejado é apenas a diferença da coluna Y dos primeiros subdiretórios de A e B , que podem ser produzidos por um comando awk/paste . Agora quero o mesmo para todos os outros subdiretórios presentes no A e B . onde no diretório 2 o arquivo data.dat deve conter a diferença na coluna Y de 0.3514/ de A e 0.4014/ de B e assim por diante.

    
por baban 23.08.2016 / 16:27

1 resposta

3

Tente este aqui.

#!/bin/bash

# Run it in the folder containing dir A and dir B.

A=A #first dir, replace with the propper name
B=B #second dir, replace with the propper name
in_file=f #replace with propper name
out_file=data.dat

B_subs=( $(ls B | sort -n) )

i=0
cd "$A"
for d in $( ls | sort -n) ; do
    a="$d"/"$in_file"
    b=../"$B"/"${B_subs[$i]}"/"$in_file"
    ((i++))
    mkdir ../"$i"
    # the one below is not correct, but gives your results
    # join "$a" "$b" | awk '{print $1, $3-$2}' > ../"$i"/"$out_file"
    # the one below is correct
    join "$a" "$b" | awk '{print $1, $2-$3}' > ../"$i"/"$out_file"
done
    
por 23.08.2016 / 19:00