6

最初の6つが同じである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と列8の平均、および$ 7 * $ 8を計算し、次のような形式を取得する必要があります。

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

これはどのようにすればよいですか?どうも

4

2 に答える 2

12

試したことはありませんが、次のようになります。

{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}
于 2012-05-05T17:12:47.790 に答える
7
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
于 2012-05-06T01:04:10.090 に答える