[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Script para acessar uma matriz
From: |
slackmonio |
Subject: |
Re: Script para acessar uma matriz |
Date: |
Fri, 08 Jan 2010 22:03:46 -0000 |
User-agent: |
eGroups-EW/0.82 |
Fala Andelnyr,
Fiz um get_data aqui mas sem carregar para um vetor.
Não sei se o tempo de execução é superior ou inferior da
versão que você fez. Talvez você queira dá uma olhada:
#!/bin/bash
[ $# -ne 2 ] && exit
LINHA_ID=`cut -f1 -d ' ' dados.txt | sed -n "/^$1/{=;q}"`
COLUNA_ID=`head -n1 dados.txt | tr ' ' '\n' | sed -n "/^$2/{=;q}"`
sed -n "${LINHA_ID}p" dados.txt | awk "{print \$$COLUNA_ID}"
O segredo ficou no sed: o comando '=' retorna a posição do
padrão na linha.
Na última linha, o sed so mostra a linha de numero LINHA_ID e
o awk extrai a coluna.
Acho que para fazer um put_data você pode usar métodos
semelhantes!
Abraços!!!
--- Em address@hidden, "Julio C. Neves" <julio.neves@...> escreveu
>
> Fala Andelnyr,
> Não tive tempo de me meter na lógica do seu prg, mas deixa eu te dar algumas
> dicas sobre vetores:
>
> Estou escrevendo um artigo sobre o Bash 4.0 do qual tirei um pedaço e
> transcrevo a seguir:
> Lendo um arquivo para um vetor
>
> Ainda falando do Bash 4.0, eis que ele surge com uma outra novidade: o
> comando intrínseco (*builtin*) mapfile, cuja finalidade é jogar um arquivo
> de texto inteiro para dentro de um vetor, sem *loop* ou substituição de
> comando
>
> -
>
> EPA! Isso deve ser muito rápido!
> -
>
> E é. Faça os teste e comprove!
>
> Exemplo:
>
> *$ cat frutas *
>
> abacate
>
> maçã
>
> morango
>
> pera
>
> tangerina
>
> uva
>
> *$ mapfile vet < frutas **Mandando frutas para vetor vet*
>
> *$ echo ${vet[@]} **Listando todos elementos de vet*
>
> abacate maçã morango pera tangerina uva
>
>
> Obteríamos resultado idêntico se fizéssemos:
>
> *$ vet=($(cat frutas))*
>
>
> Porém isso seria mais lento porque a substituição de comando é executada em
> um *subshell*.
>
> Uma outra forma de fazer isso que logo vem à cabeça é ler o arquivo com a
> opção -a do comando read. Vamos ver como seria o comportamento disso:
>
> *$ read -a vet < frutas *
>
> $ echo ${vet[@]}
>
> abacate
>
>
> Como deu para perceber, foi lido somente o primeiro registro de frutas.
>
> Pois é, se vc está usando o Bash 4.0, poderia usar este intrínseco para
> carregar o vetor. É bem mais rápido de programar e de executar.
>
> Outra dica é que vc pode emular um array de mais de uma dimensão. No seu
> caso, cada linha tem 4 campos. Supondo que a linha está em $L e o campo está
> em $C, vc poderia indexar da seguinte forma:
> L=3;C=2
> Vet [$L$C]=110
>
> Para recuperar, vc pode usar echo ${!Vet[@]}, que te devolverá todos e
> somente os índices do vetor. Se o índice estiver em $Ind,
> L=$[Ind/10]
> C=$[Ind%10]
>
> Espero que esta teoria o ajude, pq se usá-la, creio que seu prg ficará menor
> e mais rápido.
>
> Abraços,
> Julio
> Cursos de Shell e Zenity em 2 fins de semana?
> - Em SP ligue (11)2125-4747;
> - Em DF ligue (61) 3223-3000;
> - Turmas fechadas em outras cidades ligue (21) 8112-9988.
>
>
>
> 2010/1/7 andelnyr <andelnyr@...>
>
> >
> >
> > 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
> >
> >
> >
>
>
> [As partes desta mensagem que não continham texto foram removidas]
>