2012-05-05 3 views
3

У меня есть список с 8 столбцами, в которых первые 6 одинаковы.Используйте awk для вычисления суммы для нескольких столбцов

6 99999715 99999771 NM_001013399 0 - 23 0.0714286 
6 99999715 99999771 NM_001013399 0 - 24 0.0178571 
6 99999715 99999771 NM_001013399 0 - 25 0.1250000 

Мне нужно вычислить среднее значение для столбца 7 и column8, а также $ 7 * $ 8, и получить формат, как:

6 99999715 99999771 NM_001013399 0 - ave($7) ave($8) ave($7*$8) 

Как мне это сделать? ТНХ

ответ

6

Не пробовал, но это должно быть просто:

{sum7+=$7; sum8+=$8; mul+=$7*$8} END {print sum7/NR,sum8/NR,mul/NR} 

В ответ на многочисленные просьбы, я добавлю Printf.

{sum7+=$7; sum8+=$8; mul+=$7*$8} 
END {printf "%s %4i %10.7f %10.7f\n", substr($0,0,49),sum7/NR,sum8/NR,mul/NR} 
+0

Это действительно полезно ответ, показывающий некоторые вычисления AWK, но не дает выходной формат запрашивали. –

5
awk ' 
{ 
    if(common == "") { 
    fn=1 # field number 
    cn=1 # column number 
    tmp=$0 
    f=0 
    while(match(tmp,/*|$/) && f<=NF) 
    { f+=1 
     cnA[fn]=cn   # column number of start of field fn 
     cnZ[fn]=cn+RSTART-1 # column number of end of field fn 
     ++fn 
     cn+=RSTART+RLENGTH-1 
     tmp=substr(tmp, RSTART+RLENGTH) 
    } 
    common = substr($0,1,cnA[7]-1) 
    dlim78 = substr($0,cnZ[7], cnZ[7]-cnA[7]) 
    } 
    print $0 
    (f7+=$7) 
    (f8+=$8) 
} 
END { 
    p7=".0" # decimal places ($7) 
    p8=".7" # decimal places ($8) 
    pP=".7" # decimal places ($7*$8) 
    printf("%s%"p7"f%s%"p8"f%s%"pP"f\n" , 
      common, f7/NR, dlim78, f8/NR, dlim78,f7*f8/NR) 
} 
' <<'EOF' 
6 99999715 99999771 NM_001013399 0 - 23 0.0714286 
6 99999715 99999771 NM_001013399 0 - 25 0.1250000 
EOF 

Выход:

6 99999715 99999771 NM_001013399 0 - 23 0.0714286 
6 99999715 99999771 NM_001013399 0 - 25 0.1250000 
6 99999715 99999771 NM_001013399 0 - 24 0.0982143 4.7142864 
+1

Чтобы все это означало этот ответ. Я хотел бы, чтобы они показывали *** какой-либо *** другой способ maintian разделить поле, используя awk-скрипт ... Это, кажется, главный вопрос. –

+0

... и даже прокомментировал. Хорошая работа :) –