AprendiNoLinux
(usa Ubuntu)
Enviado em 18/08/2011 - 09:44h
Antes da ajuda do pessoal, a solução era.
1- gerar um arquivo temporário usando ls.
2 - Carregar o arquivo temporário com um cat
3 - No cat realizar um for para gerar outro arquivo de saída.
4 - O loop gerado no for tinha acesso ao arquivo gravado temporário várias vezes.
Como ficou.
1 - Continua sendo feito o ls.
2 - Passado a um novo shell com os dados na memória para o awk
3 - Processo em memória gera o tratamento.
4 - Saída final em arquivo formatado (que na verdade serão comandos para outro processamento.
Se eu estiver errado, por favor corrigir.
Ganhos. Se eu tiver 1.000 arquivos agora o processamento será em memória e somente no final descarregado em disco.
Em vez de gerar 3 temporários, agora só gero 1 e este nem será preciso quando for conectado a outro comando.
------------------------------------------------
# Diretório atual + tmp + tipo de trabalho + processo + extensão tmp.
_TMP_MENSAGENS="${_DIR_ATUAL}/tmp_mensagens_${$}.tmp"
# Parametros que virão de outra rotina.
_COMANDO="ls "
_ORDEM_SAIDA=" -x -1 "
_MASCARA=" *"
_EXTENSAO_ARQ=".csv"
_GERA_COMANDO="${_COMANDO}${_ORDEM_SAIDA}${_MASCARA}${_EXTENSAO_ARQ}"
# Abaixo a chamada de script que vai disparar as mensagens.
_TMP_COMAND="[SeuProgGerador]"
# Reduzido O exemplo abaixo para entender a solução final.
#No dia [16] de [Agosto 08] de [2011], você fez [123] pontos.
# O mês eu vou arrumar com uma função depois.
$_GERA_COMANDO | awk '{
_TMP_COMAND="[SeuProgGerador]"
MSG[0]="No dia "
MSG[1]="de"
MSG[2]=",você fez"
MSG[3]="pontos."
ANO=substr($0,0,4)
MES=substr($0,5,2)
DIA=substr($0,7,2)
PONTOS=substr($0,9,3)
gsub(/[^0-9]/,"",REG)
printf("%s ",_TMP_COMAND)
printf("%s", MSG[0])
printf("%s ", DIA)
printf("%s ", MSG[1])
printf("%s ", MES)
printf("%s ", MSG[2])
printf("%s ", PONTOS)
printf("%s ", MSG[3])
printf("%s\n",REG ) } ' >> "$_TMP_MENSAGENS"
-------------------
Obrigado ao @rai3mb pela ajuda inicial.
A solução proposta pelo @foxbit3r foi a melhor para este caso. Parabéns, aprendi mais uma :)
@GA_Tux
Prova do crime:
1ª versão que fazia ls, cat, for: [ real 1.593 user 0.060 sys 0.110 pcpu 10.66 ]
2ª versão ls + awk em memória: [real 0.014 user 0.000 sys 0.000 pcpu 0.00]
Imagine se você tem que fazer isto cerca de 100.000 vezes ao dia. Faz uma diferença enorme.