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 [email protected], "Julio C. Neves" <julio.ne...@...> 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.ne...@... # > #-----------------------------------------------------# > # Any doubt about this program you can find me at # > # julio.ne...@... # > ####################################################### > # 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 <edmarsso...@...> > > > 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 [email protected] <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] >
