2012-05-05 13 views
3

私は最初の6つが同じ8列のリストを持っています。awkを使って複数の列の合計を計算する

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

私はこれをどのように実行する必要があります。

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の平均を計算* $ 8と同様に$ 7、およびのようなフォーマットを取得する必要がありますか? THX

答えて

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

誰にでも、これはこの回答をマークしたものです。私はそれらにawkスクリプトを使って、フィールド分離をmaintianに*** ***の方法で表示するようにしたいと思っています...それは疑問の要点のようです。 –

+0

...それはコメントさえあります。よくやった :) –

関連する問題