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

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

Separador de arquivo


From: Wilton
Subject: Separador de arquivo
Date: Fri, 28 Oct 2011 20:41:50 -0000
User-agent: eGroups-EW/0.82

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




reply via email to

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