Non c'è bisogno di awk qui, o anche specie - se si dispone di Bash 4.0, è possibile utilizzare gli array associativi:
#!/bin/bash
declare -A values
while read key value; do
values["$key"]=$(($value + ${values[$key]:-0}))
done
for key in "${!values[@]}"; do
printf "%s %s\n" "$key" "${values[$key]}"
done
... o, se si ordina prima il file (che saranno più efficiente in termini di memoria, GNU sort è in grado di eseguire trucchi per ordinare file più grandi della memoria, che in genere uno script ingenuo - sia in awk, python o shell - non è possibile farlo in un modo che funzioni in le versioni più vecchie (mi aspetto che la segue per lavorare attraverso bash 2.0):
#!/bin/bash
read cur_key cur_value
while read key value; do
if [[ $key = "$cur_key" ]] ; then
cur_value=$((cur_value + value))
else
printf "%s %s\n" "$cur_key" "$cur_value"
cur_key="$key"
cur_value="$value"
fi
done
printf "%s %s\n" "$cur_key" "$cur_value"
fonte
2012-04-23 19:04:48
cosa esattamente fanno tali argomenti fanno per ordinare? Non li vedo nella pagina man e la pagina di invocazione mi ha lasciato confuso. – EricR
Le versioni moderne di ordinamento preferiscono la sintassi '-k' per specificare le chiavi di ordinamento:' ordina -nk1,1' invece di 'ordina + 0n -1'. Ma dal momento che le chiavi sono lettere, perché stai specificando '-n' comunque? –
@EricR: '+ 0n -1' è antiquato per' -n -k1,1': ordina numericamente il primo campo (separato da spazi bianchi). –