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.