[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
- Separador de arquivo,
Wilton <=