awk средняя часть столбца, если строки (определенное поле) совпадают - PullRequest
0 голосов
/ 08 августа 2011

Вот пример моего входного файла:

$cat NDVI-bm  
P01 031.RAW 0.516 0 0  
P01 021.RAW 0.449 0 0  
P02 045.RAW 0.418 0 0  
P03 062.RAW 0.570 0 0  
P03 064.RAW 0.469 0 0  
P04 083.RAW 0.636 0 0  
P04 081.RAW 0.592 0 0  
P04 082.RAW 0.605 0 0  
P04 084.RAW 0.648 0 0  
P05 093.RAW 0.748 0 0

Мне нужно усреднить столбец 3, если первое поле соответствует. Достаточно просто, но я изо всех сил, потому что мои знания awk - довольно основы ... Вот что у меня есть:

awk '{array[$1]+=$3(need to divide here by number of matches...)} END { for (i in array) {print i"," array[i]}}' NDVI-bm

Выполняя поиск в Интернете, я действительно не уверен, что движусь в правильном направлении ... если нет простого способа подсчитать количество совпадений, которое я не могу найти ... Любой идеи?

Спасибо за любую помощь!

Ответы [ 3 ]

4 голосов
/ 08 августа 2011

Например, для вычисления среднего числа строк, начинающихся с "P01":

/^P01/{
    num+=1
    cnt+=$3
}
END {print "avg = " cnt/num}

Выход:

$ awk -f avg.awk input
avg = 0.4825

... или, как вкладчик:

$ awk '/^P01/{cnt+=$3; num+=1} END{print "avg="cnt/num}' input

Или выполнить вычисления для всех значений первого столбца одновременно:

{
    sum[$1]+=$3
    cnt[$1]++
}


END {
    print "Name" "\t" "sum" "\t" "cnt" "\t" "avg"
    for (i in sum)
        print i "\t" sum[i] "\t" cnt[i] "\t" sum[i]/cnt[i]

}

Выходы:

$ awk -f avg.awk input
Name    sum     cnt     avg
P01     0.965   2       0.4825
P02     0.418   1       0.418
P03     1.039   2       0.5195
P04     2.481   4       0.62025
P05     0.748   1       0.748
1 голос
/ 08 августа 2011
{ total[$1] += $3; ++n[$1] }

END { for(i in total) print i, total[i] / n[i] }
0 голосов
/ 08 августа 2011

Имеет другой массив, в котором вы отслеживаете количество записей, которые вы видели для каждого индекса, и выполняете деление в блоке END.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...