for n in $(cat <<\DATA
1~CEO~ashok\~kumar~1000
2~CFO~Ranjan~2000
3~CEO~kumar~1000
DATA
)
do r=$((r+${n##*~})) ; done
echo $r
###OUTPUT
4000
Dados os dados que você mostra, um simples for loop pode fazer isso, mas se houver uma chance de <tab> ou <space> nos dados, você pode querer limitar a divisão como:
IFS='
'
... primeiro.
Ou com sed e bc :
sed 's/.*[^0-9]/r+=/;$aprint r' <<\DATA | bc
1~CEO~ashok\~kumar~1000
2~CFO~Ranjan~2000
3~CEO~kumar~1000
DATA
OUTPUT:
4000
Ambos os métodos dependem de seus dados de destino serem o último campo em cada linha.
O primeiro faz com que o shell simples seja iterável $(( aritmética )) em $((r)) depois de remover tudo, incluindo seu último delimitador de $n .
O segundo substitui tudo o que foi removido no primeiro método pela string 'r+=' e |pipes o resultado para bc , o que faz r=r+${last_field} . Na $ última linha de entrada sed também a ppends outra linha:
print r
... e |pipes para bc , que faz como instruído e gera como mostrado.