Created
June 24, 2010 13:08
-
-
Save elder/451422 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# | |
# Este script pega dados gerados pelo programa SAC e monta uma tabela com os seus | |
# valores, além de realizar o cálculo para a magnitude mR, média e desvio padrão. | |
# | |
# Autor: Elder Marco. | |
# Data: 13/06/2010 | |
# | |
#-------------------------------------------------------------------------------------- | |
# Verifica se o usuário passou o algum arquivo como argumento | |
if [ $# -ne 1 ]; then | |
echo "Você precisa passar um arquivo como argumento." | |
exit 1 | |
fi | |
# Expressão regular para apagar coisas inúteis no arquivo obtido | |
regex="^[[:blank:]]+[[:alnum:]]+[[:blank:]]=[[:blank:]]" | |
echo -n "Separando valores ... " | |
for var in KSTNM DIST USER0 ; do | |
# Pega a linha que contém a variável dada e salva em um | |
# arquivo temporário removendo o desnecessário. | |
grep "$var = " $1 > /tmp/sac2tab.$var | |
sed -r -i "s/$regex//g" /tmp/sac2tab.$var | |
done | |
echo "pronto." | |
echo | |
# O segundo campo é o valor da distância e está como uma potência de dez. | |
# Esse valor precisa ser tratado para que a entrada fique de maneira que | |
# o comando bc possa compreender. | |
echo "Corrigindo valores ..." | |
echo "Distâncias corrigidas:" | |
while read dist; do | |
# Separa a potência do restante. | |
distancia=`cut -f 1 -d 'e' <<< $dist` | |
potencia=`cut -f 2 -d 'e' <<< $dist | tr -d '+'` | |
# Agora redefine a distância e salva num arquivo separado para | |
# uso posterior. | |
distancia2=`bc <<< "scale = 9; $distancia * (10 ^ $potencia)"` | |
echo -e "\t${distancia}x10^$potencia = ${distancia2} Km" | |
echo $distancia2 >> /tmp/sac2tab.DIST.corrigido | |
sed -r -i 's/0+$//g' /tmp/sac2tab.DIST.corrigido | |
done < /tmp/sac2tab.DIST | |
echo "pronto." | |
echo | |
# O terceiro campo é o valor da amplitude e também está como uma potência | |
# de dez. Então, é feito da mesma maneira do anterior. | |
echo "Velocidades corrigidas:" | |
while read amp; do | |
# Separa a potência do restante e depois multiplica. | |
amplitude=`cut -f 1 -d 'e' <<< $amp` | |
potencia=`cut -f 2 -d 'e' <<< $amp` | |
# Calcula o valor da velocidade e depois volta para um/s, salvando | |
# em um arquivo para uso posterior. | |
velocidade=`bc <<< "scale = 9; $amplitude * (10 ^ 6) * (10 ^ $potencia);"\ | |
| sed 's/^\./0\./g'` | |
echo -e "\tV = $amplitude x 10^$potencia = ${velocidade} um/s " | |
echo $velocidade >> /tmp/sac2tab.USER0.corrigido | |
done < /tmp/sac2tab.USER0 | |
echo "pronto." | |
echo | |
# Junta os dois arquivos para calcular o valor de mR. No argumento passado ao comando | |
# bc abaixo, foi feita uma mudança de base para se trabalhar com o logaritmo na base 10. | |
paste -d' ' /tmp/sac2tab.USER0.corrigido /tmp/sac2tab.DIST.corrigido > /tmp/sac2tab.data | |
echo "Calculando magnitude mR ..." | |
echo "Valores: " | |
while read vel dist; do | |
mR=`bc -l <<< "scale = 9; l($vel/2)/l(10) + 2.3 * l($dist) / l(10) - 2.28"` | |
echo -e "\t$mR" | |
echo $mR >> /tmp/sac2tab.mR | |
done < /tmp/sac2tab.data | |
echo "pronto." | |
echo | |
# Agora junta os arquivos de distância e magnitude mR para saber quais dados levar em | |
# conta no cálculo da média e do desvio padrão. | |
paste -d' ' /tmp/sac2tab.DIST.corrigido /tmp/sac2tab.mR > /tmp/sac2tab.medstdev | |
echo "Separando valores de magnitude para o qual 200 < DIST < 1500 ..." | |
awk '$1 > 200 && $1 < 1500 { print $2 }' /tmp/sac2tab.medstdev > /tmp/sac2tab.medstdev.corrigido | |
echo "Valores:" | |
if [ `wc -l /tmp/sac2tab.medstdev.corrigido | cut -d ' ' -f 1` -ne 0 ]; then | |
for valor in $(cat /tmp/sac2tab.medstdev.corrigido); do | |
echo -e "\t$valor" | |
done | |
else | |
echo -e "\tnenhum." | |
fi | |
echo "pronto." | |
echo | |
# Faz os cálculos estatísticos. Se não houver qualquer dado, não será feita | |
# qualquer análise. | |
echo "Examinando dados para calcular média e desvio padrão de mR ..." | |
num_dados=`wc -l /tmp/sac2tab.medstdev.corrigido | cut -f 1 -d ' '` | |
if [ $num_dados -ne 0 ]; then | |
soma=`bc <<< "$(cat /tmp/sac2tab.medstdev.corrigido | paste -sd+)"` | |
media=`bc <<< "scale = 9; $soma/$num_dados"` | |
stdev=0.0 | |
for termo in $(cat /tmp/sac2tab.medstdev.corrigido); do | |
stdev="$stdev + ($termo - $media) ^ 2" | |
done | |
desvpad=`bc -l <<< "scale = 9; sqrt(($stdev) /($num_dados - 1.0))" | sed 's/^\./0\./'` | |
echo "Média: $media" | |
echo "Desvio padrão: $desvpad" | |
echo | |
else | |
echo "Não existem distâncias entre 200 e 1500KM nos dados. Não serão feitos" | |
echo "cálculos de média e desvio padrão." | |
echo | |
fi | |
echo "Montando tabela ... " | |
# Certo, agora vamos montar um arquivo base para a tabela, ler ele e depois jogar para | |
# uma saída formatada mais bonitinha. | |
paste -d ' ' /tmp/sac2tab.KSTNM /tmp/sac2tab.DIST.corrigido /tmp/sac2tab.USER0.corrigido \ | |
/tmp/sac2tab.mR > /tmp/sac2tab.tabela | |
# Procura um nome válido tomando cuidado para não sobrescrever os já existentes | |
i=1 | |
while true; do | |
[ ! -e "$(pwd)/tabela$i.dat" ] && break | |
let i++ | |
done | |
# Esse formato é necessário para que a função printf entenda número com um . | |
# como separador decimal. | |
export LC_NUMERIC=en_US.UTF-8 | |
while read estacao dist amp mR; do | |
printf "%-8s %8.3f %8.4f %8.2f\n" $estacao $dist $amp $mR >> $(pwd)/tabela$i.dat | |
done < /tmp/sac2tab.tabela | |
# Agora coloca as informações referentes a média e desvio padrão na última linha, caso | |
# se aplique. | |
if [ $num_dados -ne 0 ]; then | |
printf "%-8c %5c %8c %11.2f(%.2f)\n" X X X $media $desvpad \ | |
>> $(pwd)/tabela$i.dat | |
fi | |
echo "Gravou: $(pwd)/tabela$i.dat" | |
# Apaga todos os arquivos temporários com os dados. | |
rm -f /tmp/sac2tab.* |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment