Пробелы в наши дни относительно недороги, вам действительно следует подумать о том, чтобы получить их для своего кода, особенно если вы хотите, чтобы другие люди читали его, чтобы помочь вам в его отладке! Вот код, который вы разместили:
awk '{a[$2]+=$1}{b[$2]+=$3}{c[$2]+=$4;count[$2]+=$2}END{for(i in a)print i,a[i],b[i],c[i],count[i]}' file1
и вот он после прогонки через улучшитель кода (я использовал gawk -o
):
{
a[$2] += $1
}
{
b[$2] += $3
}
{
c[$2] += $4
count[$2] += $2
}
END {
for (i in a) {
print i, a[i], b[i], c[i], count[i]
}
}
Посмотрите, как простое добавление некоторого пробела теперь значительно упрощает понимание, и поэтому ошибка в том, как заполняется count[$2]
, явно очевидна? Некоторые осмысленные имена переменных также всегда чрезвычайно полезны, и я слышал, что буквенно-цифровые символы сейчас на особом счету!
FWIW вот как я бы это сделал:
$ cat tst.awk
BEGIN { keyFldNr = 2 }
{
numOutFlds = 0
for (i=1; i<=NF; i++) {
if (i != keyFldNr) {
sum[$keyFldNr,++numOutFlds] += $i
}
}
cnt[$keyFldNr]++
}
END {
for (key in cnt) {
printf "%s%s", key, OFS
for (i=1; i<=numOutFlds; i++) {
printf "%s%s", sum[key,i], OFS
}
print cnt[key]
}
}
$ awk -f tst.awk file
2603 36 1 2 1
2605 180 5 10 5
2606 36 1 2 1
$ awk -f tst.awk file | column -t
2603 36 1 2 1
2605 180 5 10 5
2606 36 1 2 1
Обратите внимание, что он будет работать как есть, независимо от того, сколько полей у вас есть в каждой строке, и если вам нужно использовать другое поле для ключа, который вы считаете и суммируете, вы просто измените значение keyFldNr в разделе BEGIN с 2 на то, что вы хотите, чтобы это было.
21.04.2019