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

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

Re: [shell-script] Validar campos em arquivo


From: Marcio Gil
Subject: Re: [shell-script] Validar campos em arquivo
Date: Sat, 26 Jun 2010 09:24:53 -0300
User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.9.1.10) Gecko/20100512 Thunderbird/3.0.5

Em 25/6/2010 16:51, Leandro Valiengo escreveu:
Fala gente, será que podem me ajudar?


Tenho um arquivo com esse detalhe:

00 = Proposta
01, 02, 03... - Titulos

00ICATULEANDRO  -->  Proposta da Icatu para o Leandro
01LEANDRO          -->  Titulo do Leandro
02LEANDRO          -->  Titulo do Leandro
00ACC                 -->  Proposta da ACC para o Leandro
01LEANDRO          -->  Titulo do Leandro
03LEANDRO          -->  Titulo do Leandro

Obrigatóriamente comeco com 00 q é minha proposta e abaixo dela, tenho q ter 
pelo menos um titulo, começando com 01.

Se eu tiver o exemplo abaixo, carrego o arquivo:

00ICATULEANDRO
01LEANDRO
02LEANDRO

Se eu tiver o exemplo abaixo, abendo o processo e reenvio o arquivo para o 
parceiro:

00ACC
01LEANDRO
03LEANDRO

Quero fazer essa pré-validacao por shell.

Tem algo em mente?

Abracos,

Valiengo


Sugestão com sed:

X=$(sed 's/\(..\).*/:\1/;:a;N;/\n\(00\).*/s//:\1/;//!s/\n\(..\).*/\1/;ba' temp.txt)":"

echo $X
:000102:000103:

Y=$(echo $X | sed "s/:00\(01\(02\(03\)\?\)\?\)\?:/:/g")

echo $Y
:000103:

if [ "$Y" = ":" ] ; then echo "Válido" ; else echo "Inválido" ; fi
Inválido

O problema com esta solução é que deve haver um limite para o número de
linhas em cada bloco, então se limitamos a dez:

Y=$(echo $X | sed "s/:00\(01\(02\(03\(04\(05\(06\(07\(08\(09\(10\)\?\)\?\)\?\)\?\)\?\)\?\)\?\)\?\)\?\)\?:/:/g")

Se o limite for 100... você já deve ter percebido o problema :-)

Mas talvez uma solução com awk seja mais simples, talvez até resolva em
uma linha...

Ou então você pode verificar com um loop:

n=1
i="!"
for s in `sed 's/^\(..\).*/\1/' temp.txt` ; do
  if [ "$s" = "00" ] ; then
    i="00"
  elif [ "$s" != "$i" ] ; then
    echo "Inválido na linha " $n
    i="$s"
  fi
  n=$(( $n + 1 ))
  i=$(( $i + 1 ))
  if (( $i < 10 )) ; then i=0$i ; fi
done

Marcio Gil.


reply via email to

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