2016-11-21 17 views
1

テキストファイルの要約を作成しようとしていますが、管理できない1つのひねりがあります。私はいくつかの行を持っており、私は同じカテゴリから連続した行の値の平均を取得したい。カテゴリが変更されたら、結果の要約に新しい行が必要です。bashのテキストファイルから値を集計します

テキストファイルは、次のように(TEXT.TXT)になります。

1 1 a 
2 2 a 
3 3 a 
4 4 b 
5 5 b 
6 6 a 
7 7 a 
8 8 b 

[OK]を、私はこの(カウンター、カテゴリ、平均1、平均2)を持つようにしたい:

1 a 2.0 2.0 
1 b 4.5 4.5 
2 a 6.5 6.5 
2 b 8.0 8.0 

私は、これまでに得たが、それは唯一のすべてをまとめています。これは、結果が

cat test.txt | awk '{avg1+=$1;avg2+=$2;cat=$3;count++}END{print "1",cat,avg1/count,avg2/count} 

1 b 4.5 4.5 

この権利を取得するにはどうすればよいですか?カテゴリを変更することを実現するにはどうすればいいですか? 1つのライナーは素晴らしいでしょう。どうも!

+0

あなたの質問にお答えいただき、現時点では関係のないように見える入力と出力を提供してください。あなたの問題を解決する上で、あなたがする必要があるのは、 'avg1'と' avg2'を配列に変更することです。 –

+0

ヒントのThx、Tomだが、私は自分が望むものに関して、入力と出力が一致していると思う。あなたが何を意味するのか分からないのであれば、わかりません。 – cowhi

+0

投稿が十分に文書化されています(少なくとも私は思っています) –

答えて

2

AWKのENDタグは、入力の最後にのみ実行されます。それで、あなたはただ1つの行しか持っていません。変更ごとに印刷する場合は、行が変更されたかどうかを確認し、結果が変更されたときに結果を印刷する必要があります。

あなたはそれを行うには、このスクリプトを使用することができます。

FNR == 1{ 
    previousChar = $3; 
    round=1; 
} 

{ 
    if (previousChar != $3) { 
     print int((round+1)/2),cat,avg1/count,avg2/count; 
     avg1=0.0; 
     avg2=0.0; 
     count=0; 
     round++; 
     previousChar=$3; 
    } 
    avg1+=$1; 
    avg2+=$2; 
    cat=$3; 
    count++ 
} 

END { 
    print int((round+1)/2),cat,avg1/count,avg2/count 
} 

あなたはまだENDタグで最後の最後を印刷する必要があります。

cat test.txt | awk 'FNR == 1{previousChar = $3;round=1;}{if (previousChar != $3) {  print int((round+1)/2),cat,avg1/count,avg2/count;avg1=0.0;avg2=0.0;count=0;round++;previousChar=$3;}avg1+=$1;avg2+=$2;cat=$3;count++} END {print int((round+1)/2),cat,avg1/count,avg2/count}' 

あなたの入力と出力の例:

1 a 2 2 
1 b 4.5 4.5 
2 a 6.5 6.5 
2 b 8 8 

編集:cowhi

の追加バージョンAWKスクリプトの

一つの利点は、あなたがこのように1行にそれを使用することができるということです

+0

ok、それはすでに閉じています。ありがとうございました!今では、基本的には結果の例のような各スイッチのカウンタと、除算の結果である浮動小数点数を持つ必要があります。 – cowhi

+0

さて、私は今それを得ました。不足しているものであなたの答えを更新するなら、私はそれを最良の答えとして受け入れます:cat test.txt | (1 + 2)、cat、avg1/count、avg2/count;を出力します。 avg1 = 0; avg2 = 0;カウント= 0;ラウンド++; previousChar = $ 3;} avg1 + = $ 1; avg2 + = $ 2; cat = $ 3; (平均+ 1)/ 2)、cat、avg1/count、avg2/count} ' – cowhi

関連する問題