shellscript, variables numericas/sumar variables

buenas, pues tengo un problema con un shellscript que estoy haciendo, y el problema es el siguiente:

tengo un archivo llamado arxiufinal.out que contiene lineas las cuales son de este formato:

192.3.4.6 22.5.6.3 1500 294893
132.4.6.7 3.5.6.7 5 20000
133.4.5.6 2.5.6.7 2 333
133.4.5.6 2.5.6.7 2 333
133.4.5.6 2.5.6.7 2 333
1.2.3.4 5.7.8.9 4 63

y bueno lo que tiene que hacer el script desarrollado es comparar la linea actual con la linea anterior, comparar los 2 primeros campos y, en caso de ser iguales, sumar el 3r campo actual con el 3r campo anterior, y sumar el 4rto campo actual con el 4rto anterior y pasarlos a otro archivo. Vaya que lo que tiene que hacer es eliminar repetidos.

la salida del archivo deberia ser

192.3.4.6 22.5.6.3 1500 294893
132.4.6.7 3.5.6.7 5 20000
133.4.5.6 2.5.6.7 6 999
1.2.3.4 5.7.8.9 4 63

todo va bien excepto la suma, que me dice que no es variable numerica o error de sintaxis, y ya no se que hacer, no se si hay alguna manera de que me transforme una variable a numerica, el script en cuestion es este:

if [ -e total.out ]
then
echo borrant total.out
rm total.out
fi
llargaria=$(wc -l arxiufinal.out | awk '{print $1}')
l=1
dns1anterior=$(head -1 arxiufinal.out | tail -1| awk '{print $1}')
dns2anterior=$(head -1 arxiufinal.out | tail -1| awk '{print $2}')
packetsanterior=$(head -1 arxiufinal.out | tail -1| awk '{print $3}')
bytesanterior=$(head -1 arxiufinal.out | tail -1| awk '{print $4}')
bytesactual=0
packetsactual=0

echo $dns1anterior $dns2anterior $packetsanterior $bytesanterior >>total.out

for (( l = 2; l <= $llargaria; l++ ))
do
dns1actual=$(head -$l arxiufinal.out | tail -1| awk '{print $1}')
dns2actual=$(head -$l arxiufinal.out | tail -1| awk '{print $2}')
packetsactual=$(head -$l arxiufinal.out | tail -1| awk '{print $3}')
bytesactual=$(head -$l arxiufinal.out | tail -1| awk '{print $4}')

if [ "$(echo $dns1actual)" = "$(echo $dns1anterior)" ] && [ "$(echo $dns2actual)" = "$(echo $dns2anterior)" ]
then
echo SI

sed -ne ':a' -e '$q;N;2,${P;D;}' -e 'ba' total.out > total2.out
rm total.out
cp total2.out total.out
rm total2.out

packetsanterior= $( expr $packetsactual + $packetsanterior )<------AQUI ESTA EL PROBLEMA
bytesanterior= $( expr $bytesactual + $bytesanterior )<--- AQUI ESTA EL PROBLEMA TAMBIEN

echo "$dns1actual $dns2actual $packetsanterior $bytesanterior" >> total.out

else
echo NO
echo "$dns1actual $dns2actual $packetsactual $bytesactual" >>total.out

fi

dns1anterior=$dns1actual
dns2anterior=$dns2actual
done

he probado con variables auxiliares, y varias cosas mas pero sigue sin ir, alguien sabe como arreglarlo?

gracias de antemano

Imagen de ator_18
+1
0
-1

Antepon a las variables numericas la palabra reservada let, algo asi seria:
let "packetsanterior = packetsactual + packetsanterior"

Tambien supongo que quieres redireccionar la salida al fichero, asi que prueba a ponerlo asi:
let "packetsanterior = packetsactual + packetsanterior" >> total.out

* Puede que en esa redireccion estuviera tu problema de sintaxis (fijate que no pusiste >>)

Suerte.

Linux: La puerta mejor cerrada es aquella que puede dejarse abierta.
Mi espacio -> www.freewebs.com/ator_18

+1
0
-1