2017-01-14 135 views
0

我在文件中給出了一些矩陣作爲參數。我需要找出每列的平均值,並只求列中列數大於或等於列平均值的數字。多個矩陣中大於每列平均值的值總和

例如:

f1:

10 20 30 
5 8 
9 

f2

1 1 2 2 3 
5 
6 6 
1 1 1 1 1 

f3

1 2 3 4 5 
6 7 8 4 10 
8 
10 9 8 7 6 

和第Ë輸出應該

f1: 19 20 30 
f2: 11 6 2 2 3 
f3: 18 16 16 7 10 

你像這樣運行程序:

MS.1 f1 f2 f3 

到目前爲止,我得到這個:

#!/bin/awk -f 
BEGIN { 
    M=0 
    M1=0 
    counter=1 
    fname=ARGV[1] 
    printf fname":" 
} 

(fname==FILENAME) { 
    split($0,A," ") 
    for(i=1;i<=length(A);i++) { 
     B[i]=B[i]+A[i] 
     if(A[i]<=0||A[i]>=0) 
      C[i]=C[i]+1 
    } 
    for(i=1;i<=length(B);i++) { 
     if((C[i]<0||C[i]>0)) 
      D[i]=B[i]/C[i] 
    } 
    for(i=1;i<=length(A);i++) { 
     if(A[i]>=D[i]) 
      E[i]=E[i]+" "+A[i] 
    } 
} 

(fname!=FILENAME) { 
    for(i=1;i<=length(E);i++) { 
     printf " "E[i] 
    } 
    printf "\n" 
    for(i=1;i<=length(B);i++) { 
     B[i]=0 
    } 
    for(i=1;i<=length(C);i++) { 
     C[i]=0 
    } 
    fname=FILENAME 
    printf fname":" 
} 

END { 
    for(i=1;i<=length(B);i++) { 
     printf " "B[i] 
    } 
    printf "\n" 
} 

,但它僅適用於第一個文件,然後它攪亂向上。

我的輸出

f1: 19 20 30 
f2: 30 26 31 1 1 1 
f3: 24 16 16 11 16 0 

我知道我有一個問題與所有的數組的事情。

+1

運行。如果你使用了GNU AWK(GAWK)請格式化輸入和輸出 – 123

+0

,'BEGINFILE'和'ENDFILE'應該是對你有用https://開頭www.gnu.org/software/gawk/manual/html_node/BEGINFILE_002fENDFILE.html – jas

+0

是輸入數據固定寬度數據分開嗎?或單獨的空間分開? –

回答

0

使用gawk,假設默認空白分隔符awk溶液(6 6有兩列,例如)

cat script.awk 

{ 
    for(i=1; i<=NF; ++i){ 
     d[FILENAME][FNR][i] = $i 
     sum[FILENAME][i] += $i 
     ++rows[FILENAME][i] 
    } 
    if(NF>cols[FILENAME]) cols[FILENAME]=NF 
    ++rows_total[FILENAME] 
} 
END{ 
    for(fname in rows_total){ 
     printf "%s:", fname 
     for(c=1; c<=cols[fname]; ++c){ 
      avg = sum[fname][c]/rows[fname][c] 
      sumtmp = 0 
      for(r=1; r<=rows_total[fname]; ++r){ 
       if(d[fname][r][c] >= avg) sumtmp+=d[fname][r][c] 
      } 
      printf " %d", sumtmp 
     } 
     printf "\n" 
    } 
} 

awk -f script.awk f1 f2 f3 

你,

f1: 19 20 30 
f2: 11 6 2 2 3 
f3: 18 16 16 7 10 
1

這裏的bashawk組合將簡化劇本

另存爲script.sh

$ ./script.sh f1 f2 f3