Fácil no Perl:
echo "$output" | perl -lane '
$amount{$F[$_]}{$F[0]} = $F[$_ + 1] for 2, 4, 6, 8
}{
for $bank (grep $_, keys %amount) {
print $bank, "\t",
$amount{$bank}{debit_amount} - $amount{$bank}{credit_amount} - $amount{$bank}{target_amount}
}
'
-
-n
lê a linha de entrada por linha -
-a
divide cada linha no espaço em branco com a@F
array -
-l
adiciona uma nova linha aprint
A maioria dos shells não suporta aritmética de ponto flutuante, portanto, usar uma ferramenta externa é inevitável. Aqui está um exemplo de bash
usando bc
para cálculos:
amounts=($output)
for bank_idx in 2 4 6 8 ; do
printf '%s\t' ${amounts[bank_idx]}
bc -l <<< "${amounts[bank_idx + 1]} - ${amounts[bank_idx + 11]} - ${amounts[bank_idx + 21]}"
done
${amounts[@]}
é uma matriz construída a partir da entrada inteira. Para cada banco (índices 2, 4, 6 e 8), o débito é armazenado no índice + 1, crédito no índice + 11 e alvo no índice + 21.