День добрый!Народ, никак не могу догнать как написать скрипт который бы делал следующее:
Имеется таблица(файл) вида:
Строка1 Строка2 Число1
Строка1 Строка2 Число2
Строка3 Строка2 Число3
Строка3 Строка4 Число4
Строка3 Строка2 Число5Необходимо просуммировать значения столбца 3 с агрегацией по 1-му и 2-му столбцам. Т.е. на выходе должно получиться:
Строка1 Строка2 Сумма(Число1+Число2)
Строка3 Строка2 Сумма(Число3+Число5)
Строка3 Строка2 Число4Впринципе буду признателен подсказке по реализации любыми средствами кроме SQL, но лучше на sh+awk+sed+что то еще...
Заранее благодарен!
примерно вот так получилось у меня.
таблица располагается в файле data.for key in `awk '{printf("%s %s\n", $1, $2)}' data | sort | uniq`
do
sum=""
for num in `grep $key data | awk '{print $3}'`
do
sum="$sum+$num"
done
echo "$key сумма(${sum#+})"
done
>примерно вот так получилось у меня.
>таблица располагается в файле data.
>
>for key in `awk '{printf("%s %s\n", $1, $2)}' data | sort |
>uniq`
>do
> sum=""
> for num in `grep $key data | awk
>'{print $3}'`
> do
> sum="$sum+$num"
> done
> echo "$key сумма(${sum#+})"
>doneможно и так.
cat data | cut -d\ -f-2 | sort -u | while read k; do awk "BEGIN{S=0};/^$k/{S+=\$3};END{print \"$k\",S}" data;doneЕсть подозрение, что можно все в awk запихнуть, но пиво мешает... :)
>Есть подозрение, что можно все в awk запихнуть, но пиво мешает... :)
>
можно:
awk '{k=$0;sub(/[ \t]+[0-9]+$/,"",k);s[k]+=$(NF)}END{for(k in s){print k,s[k]}}' data
:)
"Краткость - сестра таланта" (с) не помню
тем более что мой вариант требует установки IFS=перенос строки>можно:
>awk '{k=$0;sub(/[ \t]+[0-9]+$/,"",k);s[k]+=$(NF)}END{for(k in s){print k,s[k]}}' data
>:)