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

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

Re: [shell-script] Separador de arquivo


From: Tiago Peczenyj
Subject: Re: [shell-script] Separador de arquivo
Date: Sat, 29 Oct 2011 07:27:05 -0200

tente usar awk para parsear, seja usando a funcao substr ou via variavel
FIELDWIDTHS gnu-awk:


FIELDWIDTHS A  white-space  separated  list  of  fieldwidths.  When set,
gawk parses the
                   input into fields of fixed width, instead of using the
value of the FS vari-
                   able as the field separator.

agora... veja se vc nao esta criando muitos arquivos de uma vez, muito I/O
nem sempre eh performatico independente da linguagem.


2011/10/28 Wilton <address@hidden>

> **
>
>
> Ola, pessoal
>
> O meu problema é um pouco complicado de explicar, mas qualquer dúvida é só
> me falar.
> Já consegui até fazer um Script, mas gostaria de sugestões para melhorias,
> principalmente de desempenho.
> Bem, preciso separar um arquivo de texto em vários outros baseados em
> partes de cada linha dele.
> Um exemplo de uma das linhas deste arquivo é:
> 05114105841813000016417100000000121130000000000000000{00000000000000{00000000000000{00000000078486G00000000000000{05516010100010499060109201131082011156556154571051583
> R.
>
> Os dois primeiros caracteres da linha representam um registro, ou seja, a
> linha exemplo é do registro 05.
> Os caracteres, a partir da posição 151, representam erros. Os erros são
> compostos de 6 caracteres cada, então, de acordo com a linha de exemplo
> temos três erros: erro 156556 (caracteres 151 a 156), erro 154571
> (caracteres 157 a 162), e erro 051583 (caracteres 163 a 168). Os erros
> podem estender-se pelos caracteres em branco até a letra 'R'.
>
> Os registros e erros de cada linha indicarão em qual arquivo está linha
> deverá constar no resultado. Pelo exemplo que estou utilizando, a linha
> deverá então constar nos seguintes arquivos de saída, gerados também pelo
> script:
> -ArquivoResultado.05.156556.txt
> -ArquivoResultado.05.154571.txt
> -ArquivoResultado.05.051583.txt
>
> Fiz o script abaixo, que atende a necessidade mas demonstrou baixo
> rendimento, uma vez que tenho que tratar com arquivos que podem passar de 1
> Gb.
>
> # !/bin/bash
> #
> # Separador.sh
> #
> # Script para separar um arquivo de texto em vários baseados em valor de
> código de erro e registro constantes e cada linha
>
> while read LINHA; do # Laço para percorrer a linha
>
> for ind in $(seq 150 6 265); do # Indica as diversas posições em que o
> código de erro fica na linha
> nome=`echo $LINHA | cut -c$ind-$((ind+5))` # Nome do erro que fica no fim
> de cada linha do arquivo
> reg=`echo $LINHA | cut -c1-2` # Nome do registro que são os dois primeiros
> caracteres de cada linha do arquivo
> if test "$nome" != " " # Teste para indicar se ainda possui algum erro em
> determinada linha. Caso esteja em branco, sai para a outra linha.
> then
> echo "$LINHA" >> arquivoSaida.$reg.$nome.txt # Aqui gerará os vários
> arquivos com o nome do erro e o registro
> else
> break
> fi
> done
>
> done < $1 # Parametro onde o usuário indica qual arquivo deseja tratar.
>
> Solicito, por favor, amigos, que analisem o script acima e agradeço por
> qualquer sugestão.
>
> Segue abaixo também uma amostra do arquivo que será a entrada do script:
>
> 05114105841813000016417100000000121130000000000000000{00000000000000{00000000000000{00000000078486G00000000000000{05516010100010499060109201131082011156556154571051583
> R
> 05114105841813000020769400000000131130000000000000000{00000000000000{00000000000000{00000000014564{00000000000000{03751010100010499060109201131082011156556154571051583
> R
> 05114105841813000025085200000000111130000000000000000{00000000000000{00000000000000{00000000013287B00000000000000{05092010100010499060109201131082011156556154571051583
> R
> 05114105841813000025567100000000181130000000000000000{00000000000000{00000000000000{00000000020882G00000000000000{05461010100010499060109201131082011156556154571051583
> R
> 05114105841813000055403900000000121130000000000000000{00000000000000{00000000000000{00000000019494G00000000000000{04910010100010499060109201131082011156556154571051583
> R
> 05114105841813000055447200000000171130000000000000000{00000000000000{00000000000000{00000000010115B00000000000000{05702010100010499060109201131082011156556154571051583
> R
> 05114105841813000070017400000000111130000000000000000{00000000000000{00000000000000{00000000006045G00000000000000{04965010100010499060109201131082011156556154571051583
> R
> 05114105841813000073785200000000151130000000000000000{00000000000000{00000000000000{00000000073330D00000000000000{05179010100010499060109201131082011156556154571051583
> R
> 05114105841813000084251500000000151130000000000000000{00000000000000{00000000000000{00000000471382H00000000000000{04578010100010499060109201131082011156556154571051583
> R
> 05114105841813000086597800000000121130000000000000000{00000000000000{00000000000000{00000000001370A00000000000000{05048010100010499060109201131082011156556154571051583
> R
>
>  
>



-- 
Tiago B. Peczenyj
Linux User #405772

http://pacman.blog.br


[As partes desta mensagem que não continham texto foram removidas]



reply via email to

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