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: Marcos Braga
Subject: Re: [shell-script] Separador de arquivo
Date: Sun, 30 Oct 2011 10:33:33 -0200

Olá,

Não sei se entendi bem o seu problema, e o teste que fiz com as linhas que
disponibilizou geraram alguns erros, mas no final funcionaram com seu
script.

O que não entendi foi que o script gerou 3 arquivos com o mesmo conteúdo.

Como se multiplicasse o arquivo original.

Bom..., creio que isso não vem ao caso.

Em questões de performance, sempre fui a favor de diminuir o número de
forks utilizados nos scripts, e aprendi uma técnica bem bacana que diminui
os forks e melhora a performance para esse tipo de situação.

Observe as modificações que fiz no seu script e implementa no seu para ver
se te atende e se melhora a performance.

while read LINHA; do
for ind in $(seq 150 6 265); do
nome=*${LINHA:$(($ind-1)):6}*
reg=*${LINHA:0:2}*
if *[ ! -z "$nome" ]*; then
echo "$LINHA" >> arquivoSaida.$reg.$nome.txt
else
break
fi
done
done < $1

Desculpa tirar os comentários, mas era melhor para trabalhar no código.


[]s
Braga




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
>
>


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



reply via email to

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