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

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

Re: [shell-script] Identificação de parâmetros numéricos com awk


From: Breno Moiana
Subject: Re: [shell-script] Identificação de parâmetros numéricos com awk
Date: Fri, 20 Nov 2009 10:22:09 -0200

[RESOLVIDO]

Nova versao segue abaixo.

Mudei o passo 2 para dar match no parametro inteiro sem invadir o
próximo, e acertei o passo 3. Agora VALUE_PAR é exatamente a tudo o
que tem depois do "=" e antes do próximo espaço/fim de linha, sem
invadir o próximo parâmetro.


Na validação em si, estou usando match para casar a regex com o valor:

VALID= match(VALUE_PAR, "^[\'\"]?0*[0-9][\'\"]?$")
if ( VALID)
  print "Value [" VALUE_PAR "] accepted"
else
  print "Error in value: [" VALUE_PAR "]"




{
#1.Print full command line for debugging purposes
print "========>" $0

#2.if PARNUM= parameter is present, test it
if (match($0,"PARNUM=[^ ]*"))
{
#3.Select the value assigned to PARNUM
VALUE_PAR = substr($0, RSTART +7 , RLENGTH -7)

#4.test the assigned value against list
VALID= match(VALUE_PAR, "^[\'\"]?0*[0-9][\'\"]?$")
if ( !VALID)
  print "Error in value: [" VALUE_PAR "]"
else
  print "Value [" VALUE_PAR "] accepted"

}

}




O resultado agora está excelente:

========>command PARNUM=0001 BLABLA=wewew BLIBLI=laala
Value [0001] accepted
========>command PARAM1=oneone PARNUM=0002
Value [0002] accepted
========>command noparm
========>command PARAM1=oneone PARAM2=twotwo PARNUM="0003"
Value ["0003"] accepted
========>command PARNUM=4 PARAM=lalal
Value [4] accepted
========>command PAR=lalala PARNUM="5" PARA=lelele
Value ["5"] accepted
========>command PARA=lalal PARA2=leelel PARNUM=6
Value [6] accepted
========>command PAR=lalala PARNUM="5B" PARA=lelele
Error in value: ["5B"]
========>command PARA=lala PARNUM=07 PRA=pra
Value [07] accepted
========>command PARA=lalal PARNUM="008"
Value ["008"] accepted
========>command PARA=lalal PARNUM="038"
Error in value: ["038"]
========>command PARNUM=0000000009
Value [0000000009] accepted














Breno.
--
"If you're gonna eat three times a day to the day that you die, why
not be good at it?

It will save you money, it will more than likely make  you
healthier... and you'll be happier!"
Jamie Oliver



2009/11/19 Breno Moiana <address@hidden>:
> Não posso, porque na verdade esse exemplo é uma supersimplificação do
> meu problema. O script de verdade é uma coisa meio monstruosa (um
> daqueles que vem passando de mão em mão por 10 anos), então achei
> melhor limpar pra simplificar a coisa.
>
> Meus arquivos de dados são bem complexos, mas chega um determinado
> ponto em que eu faço exatamente essa operação.
>
>
> Os meus dois pontos de problema sao:
>
> #3.Select the value assigned to PARNUM
> VALUE_PAR = substr($0, RSTART +7 , 4)
>
> Para este, vou usar RLENGTH. Agora nao estou mais no escritorio, entao
> nao tenho como testar, mas acho que seria algo assim:
>
> VALUE_PAR = substr($0, RSTART +7 , RLENGTH - 7)
>
> Isso deve eliminar os casos como o exemplo 4 no meu datafile, onde ele
> pegou o começo do parametro seguinte
>
>
> A minha duvida mais séria (e util) é justamente como usar regex dentro
> de um IF em awk, para eliminar a sequencia de comparacoes com os
> valores possiveis de um a um. Isso sim está muito feio..
>
>
> Abraço!!
>
>
>
>
>
> Breno.
> --
> "If you're gonna eat three times a day to the day that you die, why
> not be good at it?
>
> It will save you money, it will more than likely make  you
> healthier... and you'll be happier!"
> Jamie Oliver
>
>
>
> 2009/11/19 Tiago Peczenyj <address@hidden>:
>> vc não pode usar uma expressão regular como em
>>
>> awk '/PARNUM=/ && !/PARNUM=[0-9.]+/{print $0}' datafile
>>
>> ou
>>
>> awk '/PARNUM=/ && !/PARNUM=\"?[0-9.]+\"?/{print $0}' datafile
>>
>> 2009/11/19 Breno Moiana <address@hidden>
>>
>>>
>>>
>>> Boa tarde, pessoal.
>>>
>>> Tenho um arquivo com uma série de comandos com seus parametros, no
>>> seguinte formato:
>>>
>>> > cat datafile
>>> command PARNUM=0001 BLABLA=wewew BLIBLI=laala
>>> command PARAM1=oneone PARNUM=0002
>>> command noparm
>>> command PARAM1=oneone PARAM2=twotwo PARNUM="0003"
>>> command PARNUM=4 PARAM=lalal
>>> command PAR=lalala PARNUM="5" PARA=lelele
>>> command PARA=lalal PARA2=leelel PARNUM=6
>>> command PARA=lala PARNUM=07 PRA=pra
>>> command PARA=lalal PARNUM="008"
>>> command PARNUM=0000000009
>>>
>>> Estou refazendo um script que identifica e valida os valores de
>>> PARNUM, que tem que ser numérico, de 0 a 9.
>>> O jeito que está feito hoje é bem deselegante, e eu queria arrumar isso.
>>> Ele força que PARNUM seja 0000, 0001, 0002, 0003, etc.
>>>
>>> Eu gostaria que aceitasse 1, 02, "0004", 03, etc.
>>>
>>> Eis o script atual, já limpo e comentado:
>>>
>>> {
>>> #1.Print full command line for debugging purposes
>>> print "========>" $0
>>>
>>> #2.if PARNUM= parameter is present, test it
>>> if (match($0,"PARNUM="))
>>> {
>>> #3.Select the value assigned to PARNUM
>>> VALUE_PAR = substr($0, RSTART +7 , 4)
>>>
>>> #4.print the assigned value for debugging
>>> print VALUE_PAR
>>>
>>> #5.test the assigned value against list
>>> if ( VALUE_PAR != "0000" && VALUE_PAR != "0001" && VALUE_PAR != "0002"
>>> && VALUE_PAR != "0003" && VALUE_PAR != "0004" && VALUE_PAR != "0005"
>>> && VALUE_PAR != "0006" && VALUE_PAR != "0007" && VALUE_PAR != "0008"
>>> && VALUE_PAR != "0009" )
>>> print "Error in value: [" VALUE_PAR "]"
>>> else
>>> print "Value [" VALUE_PAR "] accepted"
>>>
>>> }
>>>
>>> }
>>>
>>> Eu não gosto do passo 3, onde acho que deve ter um jeito de assignar o
>>> valor sem ser com uma largura fixa, nem do passo 5, que deveria poder
>>> ser substituido por uma regex. Pensei em 0*[0-9], mas nao encontrei
>>> como encaixar isso dentro do if do awk
>>>
>>> O meu output com o arquivo de teste é o seguinte (note que as linhas
>>> que nao conformam com 0001 sem aspas geram erro)
>>>
>>> ========>command PARNUM=0001 BLABLA=wewew BLIBLI=laala
>>> 0001
>>> Value [0001] accepted
>>> ========>command PARAM1=oneone PARNUM=0002
>>> 0002
>>> Value [0002] accepted
>>> ========>command noparm
>>> ========>command PARAM1=oneone PARAM2=twotwo PARNUM="0003"
>>> "000
>>> Error in value: ["000]
>>> ========>command PARNUM=4 PARAM=lalal
>>> 4 PA
>>> Error in value: [4 PA]
>>> ========>command PAR=lalala PARNUM="5" PARA=lelele
>>> "5"
>>> Error in value: ["5" ]
>>> ========>command PARA=lalal PARA2=leelel PARNUM=6
>>> 6
>>> Error in value: [6]
>>> ========>command PARA=lala PARNUM=07 PRA=pra
>>> 07 P
>>> Error in value: [07 P]
>>> ========>command PARA=lalal PARNUM="008"
>>> "008
>>> Error in value: ["008]
>>> ========>command PARNUM=0000000009
>>> 0000
>>> Value [0000] accepted
>>>
>>> Quaisquer idéias/sugestoes sao, como sempre, muito bem-vindas.
>>>
>>> Valeu!
>>>
>>> Breno.
>>> --
>>> "If you're gonna eat three times a day to the day that you die, why
>>> not be good at it?
>>>
>>> It will save you money, it will more than likely make you
>>> healthier... and you'll be happier!"
>>> Jamie Oliver
>>>
>>>
>>
>>
>>
>> --
>> Tiago B. Peczenyj
>> Linux User #405772
>>
>> http://pacman.blog.br
>>
>>
>> [As partes desta mensagem que não continham texto foram removidas]
>>
>>
>>
>> ------------------------------------
>>
>> ---------------------------------------------------------------------
>> Esta lista não admite a abordagem de outras liguagens de programação, como 
>> perl, C etc. Quem insistir em não seguir esta regra será moderado sem prévio 
>> aviso.
>> ---------------------------------------------------------------------
>> Sair da lista: address@hidden
>> ---------------------------------------------------------------------
>> Esta lista é moderada de acordo com o previsto em 
>> http://www.listas-discussao.cjb.net
>> ---------------------------------------------------------------------
>> Servidor Newsgroup da lista: news.gmane.org
>> Grupo: gmane.org.user-groups.programming.shell.brazil
>>
>> Links do Yahoo! Grupos
>>
>>
>>
>


reply via email to

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