Как использовать awk для агрегирования строк данных - PullRequest
1 голос
/ 19 января 2010

У меня вопрос, у меня есть ряд данных в строках, некоторые из которых принадлежат группе.

* 1003 например *

Apple 0.4 0.5 0.6
Orange 0.2 0.3 0.2
Apple 0.4 0.3 0.4
Orange 0.4 0.5 0.8

Вопрос в том, как я могу автоматически агрегировать столбцы, используя awk. В прошлом я легко справлялся со следующим awk вручную для каждого файла.

awk '{col2[$1]+=$2; col3[$1]+=$3; col4[$1]+=$4} END {for(i in col2){printf("%s\t%.2f\%.2f\t%.2f\n",i,col2[i]/2,col3[i]/2,col4[i]/2)}}' myfile

Но на этот раз я имею дело с несколькими файлами с разными NF (количество полей) и пытаюсь выполнить команду для автоматического расчета среднего значения по группе. В конце концов, у нас будет

Apple 0.4 0.5 0.5
Orange 0.3 0.4 0.5

Пожалуйста, сообщите. Спасибо.

Ответы [ 2 ]

4 голосов
/ 19 января 2010

вот что для начала.

awk '
{
    fruits[$1]++
    for(o=2;o<=NF;o++){
        fruit[$1 SUBSEP o]=fruit[$1 SUBSEP o]+$o
    }
}
END{
    for(combined in fruit){
        split(combined, sep,    SUBSEP)
        avg=fruit[ sep[1] SUBSEP sep[2] ]/fruits[ sep[1] ]
        f[sep[1],sep[2]]=avg
    }
    for(fr in fruits) {
        printf "%s ",fr
        for(i=2;i<=NF;i++){
            printf "%s ",f[fr,i]

        }
        print ""
    }
}' file

выход

$ ./shell.sh
Orange 0.3 0.4 0.5
Apple 0.4 0.4 0.5

Ссылка на gawk здесь

1 голос
/ 19 января 2010

Лучшее практическое введение, которое я нашел до сих пор.

AWK по примеру

Это должно дать вам базовое понимание примерно через час.

...