[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: uso de matrizes no awk
From: |
edmarssouza |
Subject: |
Re: uso de matrizes no awk |
Date: |
Fri, 06 Feb 2009 02:44:15 -0000 |
User-agent: |
eGroups-EW/0.82 |
E ai Julio, valeu pelas idéias da matriz bidimensional no shell
script, ainda não tinha idéia da mesma em shell script, mais o que eu
queria mesmo era usar matrizes bidimensional no awk sem estar dentro
de um shell script, entendeu? Usando a primeira linha do arquivo como:
#!/usr/bin/awk -f
e não:
#!/bin/bash
Mais valeu pela intenção, como sempre com seus exemplo didáticos e
scripts, é uma boa fonte de conhecimento e aprendi a usar matrizes
bidimensional no shell, foi legal. Obrigado, até mais.
Edmar de Souza Prado
--- Em address@hidden, "Julio C. Neves"
<julio.neves@...> escreveu
>
> Edmar,
> o Shell não trabalha com matrizes (polidimensionais), somente com
vetores
> (mono dimensionais), porém ele aceita qq operação com inteiros
dentro dos
> colchetes dos vetores. Assim sendo, supondo que quero criar uma
matriz
> bidimensional e que a segunda dimensão terá no máximo 100
elementos, eu
> engano o cara fazendo assim:
>
> Matriz 56, 43 => arr[56*100+43]=xxxx
>
> e para pegar os índices eu faço:
>
> let Ind1=5643/100
> let Ind2=5643%100
>
> Pessoal, um bom treino para isso, é desenvolver um jogo da velha.
Eu já
> desenvolvi a rotina do computador começando a partida, falta
desenvolver a
> do jogador fazendo o primeiro lance. Abaixo o código (pode ser que
o cliente
> de e-mail quebre algumas linhas.
>
> #!/bin/bash
> #
> #######################################################
> # JOGO DA VELHA #
> # DUVIDO QUE VOCE CONSIGA GANHAR! #
> #-----------------------------------------------------#
> # TIC TAC TOE #
> # I WON'T GIVE YOU A CHANCE. YOU'LL NEVER WIN! #
> #######################################################
> # #
> # Leia: Programacao Shell - Linux #
> # Autor: Julio Cezar Neves #
> # Editora: Brasport #
> # ISBN: 85-7452-076-4 #
> # #
> #######################################################
> # Para qualquer duvida ou esclarecimento sobre este #
> # programa estou as ordens em julio.neves@... #
> #-----------------------------------------------------#
> # Any doubt about this program you can find me at #
> # julio.neves@... #
> #######################################################
> # Se voce estiver sob o ksh, troque a 1a. linha por #
> # #!/bin/ksh #
> #-----------------------------------------------------#
> # If you are running ksh change the 1st. line for #
> # #!/bin/ksh #
> #######################################################
> # Este foi um meio divertido que encontrei para #
> # testar a compatibilidade no uso de arrays entre o #
> # bash e o ksh. Se alguem quiser desenvolver a rotina #
> # em que o adversario comeca jogando, sinta-se a #
> # vontade, porem nao esqueca de mandar-me o modulo #
> # para incorpora-lo ao meu. #
> #-----------------------------------------------------#
> # This program was developed as a funny way to test #
> # the compatibility between arrays in ksh and bash. #
> # Feel free for develop the module that the opponent #
> # start playing, but don't forget to send me the new #
> # routine because I'll attach it at this one. #
> #######################################################
> #
>
> Ganhei=0
> Empate=0
> Bold=`tput bold`
> OBold=`tput sgr0`
> Cols=`tput cols`
> if [ $Cols -lt 80 -o `tput lines` -lt 25 ]
> then
> clear
> echo "O tamanho minimo da janela deve ser 25 linhas e 80
colunas"
> exit 2
> read lixo
> fi
> Col0=`expr \( $Cols - 46 \) / 2`
> Eng=`echo "To play in english use: $Bold\`basename $0\`$OBold -e
(default
> language is portuguese)"`
>
> # Ingles ou Portugues? English or Portuguese?
> if [ "$1" = -e ]
> then
> StrIni[1]=" 1 2 3"
> StrIni[2]="1 | | +---------+----------+"
> StrIni[3]=" ---+---+--- | Ties | Wins |"
> StrIni[4]="2 | | +---------+----------+"
> StrIni[5]=" ---+---+--- | | |"
> StrIni[6]="3 | | +---------+----------+"
> StrGan="I W O N !!!"
> StrEmp="T I E"
> StrLe="Now it's our time to play (RowColumn):"
> StrEr1="At this position already has a -> "
> StrEr2="Write row and column together. I.E. 13 means row 1 and
column 3"
> StrFim="Do you want to continue?"
> else
> StrIni[1]=" 1 2 3"
> StrIni[2]="1 | | +---------+----------+"
> StrIni[3]=" ---+---+--- | Empates | Vitorias |"
> StrIni[4]="2 | | +---------+----------+"
> StrIni[5]=" ---+---+--- | | |"
> StrIni[6]="3 | | +---------+----------+"
> StrGan="G A N H E I !!!"
> StrEmp="E M P A T E"
> StrLe="Informe a sua jogada (LinhaColuna):"
> StrEr1="Nesta posicao ja existe um -> "
> StrEr2="Informe Linha e Coluna juntos. Ex: 13 = Linha 1 e Coluna
3"
> StrFim="Deseja continuar?"
> fi
>
> Escrever ()
> {
> ColIni=`expr \( $Cols - length "$2" \) / 2`
> tput cup $1 $ColIni
> echo "$2"
> }
> Iniciar ()
> {
> Jogo=
> for i in 1 2 3
> do
> for j in 1 2 3
> do
> P[$i$j]=
> done
> done
> clear
> for i in 1 2 3 4 5 6
> do
> tput cup `expr 11 + $i` $Col0
> echo "${StrIni[i]}"
> done
> Seg=`date "+%S"`
> case `expr $Seg % 5` in
> 0) Jogo=11 ; Saida=1 ;;
> 1) Jogo=13 ; Saida=2 ;;
> 2) Jogo=31 ; Saida=3 ;;
> 3) Jogo=33 ; Saida=4 ;;
> *) Jogo=22 ; Saida=5 ;;
> esac
> tput cup 16 `expr $Col0 + 29`
> echo $Bold$Empate
> tput cup 16 `expr $Col0 + 40`
> echo $Ganhei$OBold
> }
> Jogar ()
> {
> P[$1]=$2
> Lin=`echo $1 | cut -c1`
> Col=`echo $1 | cut -c2`
> Lin=`expr \( $Lin - 1 \) \* 2 + 13`
> Col=`expr \( $Col - 1 \) \* 4 + 3 + $Col0`
> tput cup $Lin $Col
> echo $2
> }
> Placar ()
> {
> tput bold
> if [ $1 = E ]
> then
> Empate=$((Empate+1))
> tput cup 22 $Col0
> echo "$StrEmp"
> tput cup 16 `expr $Col0 + 29` # Escrevendo Placar
> echo $Empate
> else
> Ganhei=$((Ganhei+1))
> tput cup 22 $Col0
> echo "$StrGan"
> tput cup 16 `expr $Col0 + 40` # Escrevendo Placar
> echo $Ganhei
> case $2 in
> L) for j in 1 2 3
> do
> Jogar $i$j X
> done
> ;;
> C) for j in 1 2 3
> do
> Jogar $j$i X
> done
> ;;
> D1)for i in 11 22 33
> do
> Jogar $i X
> done
> ;;
> *) for i in 13 22 31
> do
> Jogar $i X
> done
> esac
> fi
> tput sgr0
> }
>
> # Cuidado com o chefe! WARNING! The boss is near you!
> trap "clear ; exit" 0 2 3
>
>
> # Jogando Playing
> while true
> do
> Iniciar
> if [ "$1" != "-e" ]
> then
> Escrever 3 "$Eng"
> fi
> Jogar $Jogo X
> Vez=0
> while true
> do
> if [ $Vez -eq 4 ]
> then
> Placar E
> break
> fi
> tput cup 21 $Col0
> echo "$StrLe"
> tput cup 21 `expr $Col0 + 1 + length "$StrLe"`
> tput el
> tput cup 21 `expr $Col0 + 1 + length "$StrLe"`
> read Jogo
> case $Jogo in
> [1-3][1-3]) if [ ${P[$Jogo]} ]
> then
> tput cup 22 $Col0
> echo -n "$Bold$StrEr1${P[$Jogo]} <-$OBold"
> read Jogo
> tput cup 22 $ColIni
> tput el
> tput cup 21 `expr $Col0 + 1 + length "$StrLe"`
> tput el
> continue
> fi
> Jogar $Jogo O
> Vez=$((Vez+1))
> ;;
> *) tput cup 22 $Col0
> echo -n "$Bold$StrEr2$OBold"
> read Jogo
> tput cup 22 $Col0
> tput el
> tput cup 21 `expr $Col0 + 1 + length "$StrLe"`
> tput el
> continue
> esac
>
> for i in 1 2 3
> do
> LX[i]=0 ; CX[i]=0 ; LO[i]=0 ; CO[i]=0 ; DX[i]=0 ; DO[i]=0
> done
>
> for i in 1 2 3
> do
> for j in 1 2 3
> do
> [ "${P[$i$j]}" = X ] && LX[i]=$((${LX[$i]}+1))
> [ "${P[$i$j]}" = O ] && LO[i]=$((${LO[$i]}+1))
> [ "${P[$j$i]}" = X ] && CX[i]=$((${CX[$i]}+1))
> [ "${P[$j$i]}" = O ] && CO[i]=$((${CO[$i]}+1))
> done
> done
> for i in 11 22 33
> do
> [ "${P[$i]}" = X ] && DX[1]=$((${DX[1]}+1))
> [ "${P[$i]}" = O ] && DO[1]=$((${DO[1]}+1))
> done
>
> for i in 13 22 31
> do
> [ "${P[$i]}" = X ] && DX[2]=$((${DX[2]}+1))
> [ "${P[$i]}" = O ] && DO[2]=$((${DO[2]}+1))
> done
>
> # Pra ganhar I wanna win!
>
> for i in 1 2 3
> do
> LAlinhadas[i]=$((${LX[i]}-${LO[i]}))
> CAlinhadas[i]=$((${CX[i]}-${CO[i]}))
> DAlinhadas[i]=$((${DX[i]}-${DO[i]}))
> if [ ${LAlinhadas[i]} -eq 2 ]
> then
> for j in 1 2 3
> do
> [ ${P[$i$j]} ] && continue
> Jogo=$i$j
> Jogar $Jogo X
> Placar G L
> break 3
> done
> fi
> if [ ${CAlinhadas[i]} -eq 2 ]
> then
> for j in 1 2 3
> do
> [ ${P[$j$i]} ] && continue
> Jogo=$j$i
> Jogar $Jogo X
> Placar G C
> break 3
> done
> fi
> done
> if [ ${DAlinhadas[1]} -eq 2 ]
> then
> for i in 11 22 33
> do
> [ ${P[$i]} ] && continue
> Jogo=$i
> Jogar $Jogo X
> Placar G D1
> break 2
> done
> fi
> if [ ${DAlinhadas[2]} -eq 2 ]
> then
> for i in 13 22 31
> do
> [ ${P[$i]} ] && continue
> Jogo=$i
> Jogar $Jogo X
> Placar G D2
> break 2
> done
> fi
>
> # Pra nao perder I don't wanna lose
>
> for i in 1 2 3
> do
> if [ ${LAlinhadas[i]} -eq -2 ]
> then
> for j in 1 2 3
> do
> [ ${P[$i$j]} ] && continue
> Jogo=$i$j
> Jogar $Jogo X
> continue 3
> done
> fi
> if [ ${CAlinhadas[i]} -eq -2 ]
> then
> for j in 1 2 3
> do
> [ ${P[$j$i]} ] && continue
> Jogo=$j$i
> Jogar $Jogo X
> continue 3
> done
> fi
> done
> if [ ${DAlinhadas[1]} -eq -2 ]
> then
> for i in 11 22 33
> do
> [ ${P[$i]} ] && continue
> Jogo=$i
> Jogar $Jogo X
> continue 2
> done
> fi
> if [ ${DAlinhadas[2]} -eq -2 ]
> then
> for i in 13 22 31
> do
> [ ${P[$i]} ] && continue
> Jogo=$i
> Jogar $Jogo X
> continue 2
> done
> fi
>
> # Ao ataque! Let's attack!
>
> case $Vez in
> 1) case $Saida in
> 1) [ ${P[33]} ] && Jogo=13 || Jogo=33 ;;
> 2) [ ${P[31]} ] && Jogo=33 || Jogo=31 ;;
> 3) [ ${P[13]} ] && Jogo=11 || Jogo=13 ;;
> 4) [ ${P[11]} ] && Jogo=31 || Jogo=11 ;;
> *) if [ ${P[11]} ]
> then
> Jogo=33
> elif [ ${P[33]} ]
> then
> Jogo=11
> elif [ ${P[13]} ]
> then
> Jogo=31
> else
> Jogo=13
> fi
> esac ;;
> *) [ $P{[22]} ] &&
> {
> Jogo=
> for i in 1 3
> do
> for j in 1 3
> do
> [ ${P[$i$j]} ] &&
> {
> [ ${P[$j$i]} ] && continue ||
> {
> Jogo=$j$i
> break 2
> }
> } || {
> Jogo=$i$j
> break 2
> }
> done
> done
> [ "$Jogo" ] &&
> {
> Jogar $Jogo X
> continue
> }
> for i in 1 2 3
> do
> for j in 1 2 3
> do
> [ "${P[$i$j]}" ] && continue
> Jogo=$i$j
> break 2
> done
> done
> } || Jogo=22
> esac
> Jogar $Jogo X
> done
> tput cup 23 $Col0
> echo "$StrFim"
> tput cup 23 `expr $Col0 + length "$StrFim" + 1`
> read a
> [ `echo $a | tr n N` = N ] && exit
> done
> --
> Abração,
> Julio
> *Cursos de Shell e Zenity nos finais de semana:
> - Em SP ligue (11) 2125-4747;
> - Em DF ligue (61) 3223-3000;
> - No RJ brevemente;
> - Turmas fechadas em outras cidades ligue (21) 8112-9988*
>
>
>
> 2009/2/5 edmarssouza <edmarssouza@...>
>
> > E ai jimmy, valeu pela ajuda colega. São de grande ajuda.
> > Mais fiquei com uma dúvida quanto a matriz bidimensional, se fosse
> > possivel você colocar um exemplo simples para mim ter uma idéia da
> > matriz em um contexto, seria de maior ajuda. Agradeço desde já. Um
> > abraço e obrigado denovo.
> >
> > Edmar de Souza Prado
> >
> > --- Em address@hidden <shell-script%
40yahoogrupos.com.br>,
> > jimmy <ronaldo_tgz@>
> > escreveu
> > >
> > > On Thu, Feb 05, 2009 at 07:57:48AM -0000, edmarssouza wrote:
> > > > E ai pessoal tudo bem?
> > > > Preciso de uma ajudinha, agradeceria a colaboração de todos.
> > > > É o seguinte queria saber como faço para declarar várias
matrizes
> > em
> > > > awk, em apenas uma linha ou pouca linha? Porque exemplo em
shell
> > > > script, faço:
> > > >
> > > > array=("shell" "script" "é" "demais")
> > > >
> > > > Desse modo declarei um array em apenas uma linha. Pois no awk
> > > > atualmente uso o seguinte modo:
> > > >
> > > > array[1]="awk"
> > > > array[2]="é"
> > > > array[3]="demais"
> > >
> > > no gawk o mais próximo disso que conheço seria usando o comando
> > split:
> > >
> > > awk 'BEGIN{split("awk é demais",array); print array[2]}'
> > >
> > > >
> > > > E isso se torna muito trabalhoso com muitas matrizes. Outra
> > coisinha
> > > > como trabalho com matrizes bidimensional em awk?
> > >
> > > array[1,1] = "bidimensional"
> > >
> > > > Quem puder me ajudar
> > > > com um exemplo ou link para uma apostila, ficarei imensamente
> > > > agradecido.
> > >
> > > http://www.gnu.org/software/gawk/manual/gawk.txt
> > >
> > > > Obrigado a todos que contribuirem fico agradecido pela
> > > > atenção desde já. Um abraço.
> > > >
> > > > Edmar de Souza Prado
> > > >
> > > > ------------------------------------
> > >
> > >
> > > --
> > > " Não manejo bem as palavras
> > > Mas manipulo bem as strings."
> > > ------------------------------
> > >
> >
> >
> >
>
>
> [As partes desta mensagem que não continham texto foram removidas]
>