Apenas algumas coisas sobre esse script, ignorando que é um script de shell que lida com XML.
- Ele lê cada arquivo na memória.
- Ele usa algumas construções que são "má prática".
Vamos consertar isso.
-
Primeiro, cada comando não precisa terminar com
;. O;é usado se você colocar vários comandos em uma linha, comols; echo "hello". -
As expansões variáveis também devem ser citadas em duplicidade. Consulte " Implicações de segurança do esquecimento para citar uma variável em shells bash / POSIX ". Por exemplo:
Ext="$1",XMLHeader >"$OutPutFileName", etc. -
for Vfile in $(ls | grep .$Ext)é melhor escritofor Vfile in ./*."$Ext". -
Em vez de fazer vários redirecionamentos em um loop, todos anexando ao mesmo arquivo, finalize o loop com
done >>"$OutPutFileName". Isso é mais eficiente. -
VarRow='cat $Vfile'colocará o conteúdo de um arquivo de 85Mb em uma única variável e, em seguida,for Row in $(echo $VarRow )fará um loop sobre as linhas, ou assim você espera. Em vez disso, façawhile IFS= read -r Row; do ... done <"$Vfile". Isto irá ler uma linha de cada vez. Em vez de armazenar o arquivo inteiro, você sempre armazena uma linha por vez. É provavelmente aí que você se depara com problemas de memória. -
Em vez de
VarCell='echo $VarRow'seguido porfor Cell in $(echo $VarCell | sed "s/,/ /g"), basta fazerVarCell="${VarRow//,/ }"seguido porfor Cell in $VarCell(isso é um pouco duvidoso, uma variável sem aspas que contém dados de entrada, sugestões de melhorias são bem-vindas) -
Qualquer
echoque produza dados variáveis, eu mudaria paraprintfcom uma cadeia de formato de aspas simples seguida por expansões variáveis com aspas duplas. Por exemplo:echo "<Worksheet ss:Name=\"$Vfile\"><Table>"muda paraprintf '<Worksheet ss:Name="%s"><Table>\n' "$VFile". Veja " Por que printf é melhor que echo? ". -
Quando você deseja produzir uma cadeia longa (várias linhas), use um documento here. Dessa forma, você também não precisa se preocupar em escapar de citações.