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.

Responder a