No hay necesidad de awk aquí, o incluso ordenar - si tiene Bash 4.0, se pueden utilizar matrices asociativas:
#!/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, si ordena primero el archivo (que habrá más eficiente en memoria; GNU sort puede hacer trucos para ordenar archivos más grandes que la memoria, lo que un script ingenuo, ya sea en awk, python o shell, normalmente no lo hará), puedes hacer esto de una manera que funcione en versiones anteriores (I esperan que el siguiente para trabajar a través de 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"
lo que es exactamente lo que hacen los argumentos para ordenar? No los veo en la página del manual y la página de invocación me ha dejado confundido. – EricR
Las versiones modernas de género prefieren la sintaxis '-k' para especificar claves de clasificación:' ordenar -nk1,1' en lugar de 'ordenar + 0n -1'. Pero dado que las teclas son letras, ¿por qué estás especificando '-n' de todos modos? –
@EricR: '+ 0n -1' está pasado de moda para' -n -k1,1': ordenar numéricamente por el primer campo (separado por espacios en blanco). –