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

[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]
>




reply via email to

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