Символы пробела относительно недороги в наши дни, вам действительно стоит подумать о том, чтобы получить их для своего кода, особенно если вы хотите, чтобы другие читали его, чтобы помочь вам отладить его!Вот код, который вы разместили:
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
Обратите внимание, что это будет работатьas-не имеет значения, сколько у вас полей в каждой строке, и если вам нужно использовать другое поле для ключа, на который вы рассчитываете и суммируете, то вы просто меняете значение keyFldNr в разделе BEGIN с 2 на любое другое значениебыть.