Keine Notwendigkeit für awk hier, oder sogar Art - wenn Sie Bash 4.0 haben, können Sie assoziative Arrays verwenden:
#!/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
... oder, wenn Sie die Datei zuerst sortieren (die mehr sein Speicher-effizient, GNU-Sortierung ist in der Lage, Tricks zu tun, um Dateien größer als Speicher zu sortieren, was ein naives Skript - ob in Awk, Python oder Shell - normalerweise nicht tun wird, Sie können dies in einer Weise tun, die funktioniert ältere Versionen (ich erwarte, dass die folgenden durch bash arbeiten 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"
was genau diese Argumente tun zu sortieren? Ich sehe sie nicht in der Manpage und die Aufrufseite hat mich verwirrt. – EricR
Moderne Versionen von sort bevorzugen die '-k'-Syntax zum Angeben von Sortierschlüsseln: 'sort -nk1,1' anstelle von' sort + 0n -1'. Aber da die Schlüssel Buchstaben sind, warum gibst du dann '-n' an? –
@EricR: '+ 0n -1' ist altmodisch für' -n -k1,1': numerisch sortiert nach dem ersten (Leerzeichen getrennten) Feld. –