2017-08-03 4 views
1

追加の列と他の列が一致し、印刷における値:平均カラム場合、私は、このようなファイル有する

Score  1  24  HG  1 
Score  2  26  HG  2 
Score  5  56  RP  0.5 
Score  7  82  RP  1 
Score  12  97  GM  5 
Score  32  104  LS  3 

私はコラム4が同一である場合、列5を平均し、カラム6ように平均値を印刷したいと

Score  1  24  HG  1  1.5 
Score  2  26  HG  2  1.5 
Score  5  56  RP  0.5 0.75 
Score  7  82  RP  1  0.75 
Score  12  97  GM  5  5 
Score  32  104  LS  3  3 

ここで私が見つけた解決策をいくつか試しました。例:

awk '{ total[$4] += $5; ++n[$4] } END { for(i in total) print i, total[i]/n[i] }' 

は、それらはすべてこれで終わる:私は多くの情報を失うとして望ましくない

HG  1.5 
RP  0.75 
GM  5 
LS  3 

を。

+0

列4の同じ値は常に隣接していますか? – choroba

+0

彼らは常にはいです。 – markryan

答えて

2

あなたは二回、あなたのテーブルを反復処理することができます(すでにとして)最初の反復で行い平均値を算出し、その後、2回目の反復でそれらをプリントアウト:最後に二回

awk 'NR==FNR { total[$4] += $5; ++n[$4] } NR>FNR { print $0, total[$4]/n[$4] }' file file 

お知らせfile 。 「最初の」ファイルNR==FNRを調べて、適切な値を合計し、それらをメモリ内に保持します(変数totalおよびn)。 「第二」のファイルトラバーサル、NR>FNR、そして私たちは、すべての元のデータ+平均をプリントアウト時には:

Score  1  24  HG  1  1.5 
Score  2  26  HG  2  1.5 
Score  5  56  RP  0.5 0.75 
Score  7  82  RP  1  0.75 
Score  12  97  GM  5  5 
Score  32  104  LS  3  3 
+1

完璧に動作します、ありがとう!最後の2回のファイルは私が以前見たことではありません。 – markryan

+0

これは単に 'awk'が同じファイルを2回取得することを意味します。 'file1'、' file2'と同じです。 – randomir

1

あなたは、ファイルを介して1つのパスを使用できますが、メモリ内のファイル全体を保存するために持っているので、ディスクI/oメモリトレードオフ対:

awk ' 
    BEGIN {FS = OFS = "\t"} 
    {total[$4] += $5; n[$4]++; line[NR] = $0; key[NR] = $4} 
    END {for (i=1; i<=NR; i++) print line[i], total[key[i]]/n[key[i]]} 
' file 
関連する問題