Нет необходимости AWK здесь, или даже своего рода - если у вас есть Bash 4.0, вы можете использовать ассоциативные массивы:
#!/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
... или, если отсортировать файл первым (который будет более экономия памяти, GNU sort может делать трюки для сортировки файлов, больших, чем память, что наивный скрипт - будь то в awk, python или shell - обычно не будет), вы можете сделать это таким образом, который будет работать в более старые версии (я ожидаю, что следующие работы через Баш 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"
, что именно делает эти аргументы делают для сортировки? Я не вижу их на странице руководства, и страница с вызовом оставила меня в замешательстве. – EricR
Современные версии сортировки предпочитают синтаксис '-k' для указания ключей сортировки:' sort -nk1,1' вместо 'sort + 0n -1'. Но поскольку ключи являются буквами, почему вы все-таки указываете '-n'? –
@EricR: '+ 0n -1' старомодно для' -n -k1,1': сортировать численно первым (разделенным пробелом) полем. –