A sintaxe exata dependerá da entrada exata. Se o campo de valor sempre iniciar <space><dollar>
, podemos usar uma instrução awk:
awk -F: '$2 ~ /^ \$/ { a[$1]+=substr($2,3)} END {for (b in a) { print b"$"a[b]}}'
por exemplo
awk -F: '$2 ~ /^ \$/ { a[$1]+=substr($2,3)} END {for (b in a) { print b"$"a[b]}}' testfile.txt
3/3/16 $25
2/2/15 $14
1/1/15 $15
Observação: se o caractere do separador for realmente um |
e não um :
, será necessário fazer awk -F'|' ...
.
A maneira como isso funciona é:
$2 ~ /^ \$/
- para cada linha em que o segundo campo começa <space><dollar>
{ a[$1]+=substr($2,3)}
- Adiciona o conteúdo do segundo campo (retirando os dois primeiros caracteres) a um array indexado pela data
END {for (b in a) { print b"$"a[b]}}'
- quando o arquivo terminar, percorra todas as datas encontradas e imprima o total.
Portanto, basicamente, a matriz a
é indexada por data e contém a soma dos valores vistos para essa data.