[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [shell-script] Re: Filtro para TXT - Campos com Comprimento Fixo
From: |
Andreyev Dias de Melo |
Subject: |
Re: [shell-script] Re: Filtro para TXT - Campos com Comprimento Fixo |
Date: |
10 Sep 2003 13:39:48 -0300 |
Oi Cesar,
Não sei se compreendi a sua dúvida, mas acho que os campos não sofrendo
variações vc poderia fazer algo assim:
#------------------------>8----------------------
BEGIN {
print "Tipo\t\tSerie\tCodigo\t\tData"
} # 'cabecalho' do programa
{
if ( substr($1, 1, 1) ~ /E/ ){
print "Entrada \t" substr($1, 2, 1) "\t" \
substr($1, 3, 8) "\t" substr($1, 11, 4)
} else {
print "Saida \t\t" substr($1, 2, 1) "\t" \
substr($1, 3, 8) "\t" substr($1, 11,4)
}
}
END {}
#------------------------>8----------------------
Do man do gawk;
"substr(s, i [, n]) Returns the at most n-character substring of s
starting at i. If n is omitted, the rest of s is used."
Pode-se pensar alguma coisa com o "cut -c"...
Espero que tenha sido util!
À disposição,
[]s
Andreyev
ps: caso não tenha 'habilidade' com o awk:
execute assim: awk -f <arquivo script> <arquivo script>
as "\" das linhas 6 e 10 são "quebras" de linha
mais inf em: http://www.delorie.com/gnu/docs/gawk/
Em Qua, 2003-09-10 às 10:41, César A. K. Grossmann escreveu:
> --- Em address@hidden, "Gabriel Federizzi"
> <gabriel@s...> escreveu
> > E se vc usar: tr -s " " "|"
> >
> > para substituir cada conjunto de espaços por um | ou autra coisa do
> genero.
> > Assim você tem um separador.
>
> Talvez eu não tenha explicado direito o problema. Suponha que eu tenho
> o seguinte banco de dados (vou tentar colocar duas linhas, cada linha
> é um registro, ok?):
>
> E1199912100013
> S1200001030015
>
> Esquisito? Mas é mais ou menos isto que eu tenho, só que as linhas são
> maiores. Examinando a documentação fornecida pelo cliente, eu sei que
> o primeiro caracter ("E" na primeira linha, "S" na segunda") é o tipo
> de registro, por exemplo, e "E" significa entrada enquanto "S"
> significa saída. O segundo caracter ("1" nos dois registros do
> exemplo) é um número de série, por exemplo. Os oito caracteres que
> seguem são a data do movimento, por exemplo, e os quatro números que
> restam são um códgio qualquer. Colocando esta informação na forma de
> uma tabelinha, eu teria o seguinte:
>
> Campo Posicao Comprimento
> Tipo 1 1
> Serie 2 1
> Data 3 8
> Codigo 11 4
>
> Este seria o leiaute do arquivo fornecido. Eu não preciso tentar
> adivinhar isto, ele é fornecido (embora às vezes o leiaute fornecido
> não confira com o leiaute do arquivo, ou seja, está com erros). Só que
> nem sempre este leiaute está no formato que eu preciso. Suponhamos no
> exemplo acima que o cliente deveria ter entregue um leiaute um pouco
> diferente, com o campo Codigo entre Serie e Data, e com um comprimento
> de 3 posicoes, e Serie deveria ter duas posições, em vez de uma só. Ou
> seja, o leiaute deveria ser:
>
> Campo Posicao Comprimento
> Tipo 1 1
> Serie 2 2
> Codigo 4 3
> Data 7 8
>
> O meu problema é escrever um programa que leia o arquivo original,
> faça o desdobramento do mesmo nos campos *fornecidos*, e escreva o
> arquivo no formato *desejado*. Um filtro, portanto...
>
> Ficou mais claro?
>
> []s
> --
> César A. K. Grossmann
> http://www.LinuxByGrossmann.cjb.net/
>
>
>
> ---------------------------------------------------------------------
> 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.listasdiscussao.cjb.net
> ---------------------------------------------------------------------
>
>
> Seu uso do Yahoo! Grupos é sujeito às regras descritas em:
> http://br.yahoo.com/info/utos.html
>