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
echo
que produza dados variáveis, eu mudaria paraprintf
com 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.