Algumas ideias:
-
Uma "expansão de parâmetro" de um valor variável (a parte $ {...}):
echo "arr$COUNTER[0] = ${arr$COUNTER[0]}"
não funcionará. Você pode contornar usando eval (mas eu não recomendo):
eval echo "arr$COUNTER[0] = \${arr$COUNTER[0]}"
Essa linha poderia ser escrita assim:
i="arr$COUNTER[0]"; echo "$i = ${!i}"
Isso é chamado de indirecção (o!) no Bash.
-
Um problema semelhante acontece com esta linha:
declare -a "arr$COUNTER=($field)"
Que deve ser dividido em duas linhas e eval usado:
declare -a "arr$COUNTER" eval arr$COUNTER\=\( \$field \)
Mais uma vez, não recomendo usar eval (neste caso).
-
Como você está lendo todo o arquivo na memória do shell, podemos também usar um método mais simples para colocar todas as linhas em um array:
readarray -t lines <"VALUES_FILE.txt"
Isso deve ser mais rápido do que chamar o awk para cada linha.
Um script com todos os itens acima poderia ser:
#!/bin/bash
valfile="VALUES_FILE.txt"
readarray -t lines <"$valfile" ### read all lines in.
line_count="${#lines[@]}"
echo "Total number of lines $line_count"
for ((l=0;l<$line_count;l++)); do
echo "Counter value is $l" ### In which line are we?
echo "Field = ${lines[l]}" ### kepth only to help understanding.
k="arr$l" ### Build the variable arr$COUNTER
IFS=" " read -ra $k <<<"${lines[l]}" ### Split into an array a line.
eval max=\${#$k[@]} ### How many elements arr$COUNTER has?
#echo "field $field and k=$k max=$max" ### Un-quote to "see" inside.
for ((j=0;j<$max;j++)); do ### for each element in the line.
i="$k[$j]"; echo "$i = ${!i}" ### echo it's value.
done
done
echo "The End"
echo
No entanto, ainda assim, o AWK pode ser mais rápido, se pudermos executar o que você precisa no AWK.
Um processamento similar pode ser feito no awk. Assumindo que os 6 valores serão usados como um IP (4 deles) e os outros dois são um número e um tempo de época.
Apenas uma amostra muito simples de um script AWK:
#!/bin/sh
valfile="VALUES_FILE.txt"
awk '
NF==6 { printf ( "IP: %s.%s.%s.%s\t",$1,$2,$3,$4)
printf ( "number: %s\t",$5+2)
printf ( "epoch: %s\t",$6)
printf ( "\n" )
}
' "$valfile"
Basta fazer uma nova pergunta com os detalhes.