shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Script para acessar uma matriz


From: andelnyr
Subject: Script para acessar uma matriz
Date: Fri, 08 Jan 2010 01:08:29 -0000
User-agent: eGroups-EW/0.82

Prezados
Sou iniciante nessa cachaça que é a programação em Shell Script e tenho 
acessado bastante as mensagens aqui do grupo e consultado tanto o livro do 
Júlio quanto o do Aurélio e tenho encontrado as respostas para a esmagadora 
maioria das minhas dúvidas.
Recentemente comecei a desenvolver em caráter didático, melhorias em alguns 
scripts para o sistema que emprego no meu trabalho. Já estou há um pouco mais 
de um mês nisso e percebo alguma evolução, pois a cada dia que passa, consigo 
entender um pouco mais dos códigos que antes pareciam ter sido escritos em 
alguma espécie de língua morta.
Atualmente me deparo com uma dificuldade que não consegui solucionar sozinho, 
daí decidi recorrer aos "universitários".

Possuo um arquivo de texto chamado dados.txt com o seguinte conteúdo:

EQP     VL1     VL2     VL3
A       100     120     150
B       110     130     100
C       23      45      90

É uma matriz e pelo que já li o shell não trata matrizes polidimensionais, 
ficando apenas com as unidimensionais – os vetores.
Desejo poder ler e escrever neste arquivo fornecendo linha e coluna para 
acessar os dados e escrevi o seguinte código:

#Transforma de coluna para índice do vetor
coluna2id() {
case "$coluna" in
        "VL1") id="1" ;;
        "VL2") id="2" ;;
        "VL#") id="3" ;;
esac
}

#Função para "pegar" um dado
get_data() {
linha="$1"
coluna="$2"
coluna2id
while read dados
do
vetor_dados=( $dados )
if [ "${vetor_dados[0]}" = "$linha" ]
then
        echo "${vetor_dados["$id"]}"
fi
done < dados.txt
}

#Função para "escrever" um dado
put_data() {
linha="$1"
coluna="$2"
valor="$3"
col2id
while read dados
do
vetor_dados=( $dados )
if [ "${vetor_dados[0]}" = "$valor" ] 
then
        vetor_dados["$id"]="$valor"
        linha_tmp="${vetor_dados[*]}"
fi
done < dados.txt

grep -i -v "$vao" dados.txt > dados.tmp
echo "${linha_tmp[*]}" >> dados.tmp
mv dados.tmp  dados.txt
}

Se você fizer:
get_data A VL3 – você tem como resultado 150

put_data C VL2 70 – você substitui o valor 45 pelo valor 70 no arquivo.

Tudo funciona, porém este processo de leitura e escrita será realizado um 
grande número de vezes e como todo o processo de dá através de leitura e 
escrita em disco a coisa toda acaba sendo relativamente lenta – 6 ms para 
leitura e 37 ms para escrita no pior caso.

Pensei em realizar estas atividades com variáveis e não com arquivos para 
evitar o grande número de operações de leitura e escrita no HD, mas já tentei 
algumas modificações e não obtive nenhum resultado.

Gostaria de alguma sugestão para melhoria deste tempo de acesso.

Desde já agradeço 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]