2016-03-21 11 views
-1

ファイルに6行あります。私はファイル内の特定の行の平均しか見つけ出す必要はなく、他の行はそのまま残しておく必要があります。平均的には、他の行は、彼らがそうであるように維持する必要があり、A1とA2、B1とB2のために計算されなければならないファイル内の特定の行の平均値

入力:

A1 1 1 2 
A2 5 6 1 
A3 1 1 1 
B1 10 12 12 
B2 10 12 10 
B3 100 200 300 

出力:

A1A2 3 3.5 1.5  
A3 1 1  1 
B1B2 10 12 11  
B3 100 200 300 

EDIT:n列ではあります合計

答えて

0
$ cat tst.awk 
$1 ~ /^[AB]1$/ { for (i=2;i<=NF;i++) val[$1,i]=$i; next } 
$1 ~ /^[AB]2$/ { p=$1; sub(2,1,p); $1=p $1; for (i=2;i<=NF;i++) $i=($i + val[p,i])/2 } 
{ print } 

$ awk -f tst.awk file | column -t 
A1A2 3 3.5 1.5 
A3 1 1 1 
B1B2 10 12 11 
B3 100 200 300 
+0

出力ファイルはタブ区切りではなく、最初のように区切られているようです。ファイルがタブで区切られていることを確認するにはどうすればよいですか? – Tonja

+0

awkスクリプトの先頭に 'BEGIN {FS = OFS =" \ t "}'を追加し、 '| awkへの呼び出しの後に「-t列」を挿入します。入力/出力ファイルに、特定の区切り文字(タブ文字など)がある場合には、その質問には非常に重要です。 –

1

awkレスキュー!

$ awk '/[AB][12]/{a=substr($1,1,1); 
        k=a"1"a"2"; 
        c1[k]+=$2; c2[k]+=$3; c3[k]+=$4; n[k]++; next} 
       1; 
      END{for(k in c1) 
        print k, c1[k]/n[k], c2[k]/n[k], c3[k]/n[k]}' file | sort | column -t 

A1A2 3 3.5 1.5 
A3 1 1 1 
B1B2 10 12 11 
B3 100 200 300 

パターンはグループ化された行と一致し、キーを作成し、すべてのフィールドの合計とキーごとの行数を計算します。一致しない行を印刷する。注文が保存されていないので、平均化された行を印刷すると整形が簡単になり、columnにパイプがソートされます。

+0

ファイルにn個の列があることを忘れてしまいました。 – Tonja

関連する問題