0

こんにちは、2 つの列を含むファイルがあります。最後の列の合計を取得し、最後の列で指定された各値のパーセンテージを総計に対して計算して印刷したいと考えています。
サンプルファイル

$ cat /cygdrive/c/KPI/test/file.csv  
5,10266  
7,8009854  
0,1441242  
1,6722341  
Total,16183703 

したがって、最後の列の合計は 16183703 です。
必要な出力

Failure_Code,FAILURE_SUM,Ratio  
5,10266,0.06%  
7,8009854,49.49%  
0,1441242,8.91%  
1,6722341,41.54%  
Total,16183703,100.00%  
4

3 に答える 3

2

通常、3 つのアプローチがあります: 入力をバッファリングする ( Fedorquikonsoleboxなど)、ファイルを 2 回読み取る ( sg-lecram など)、またはtac入力を逆方向にパイプしtacて、変換を実行した後にパイプスルーするために使用します。私は通常tac、この種のことに対してアプローチをとります:

$ tac file | awk 'NR==1{t=$2}{$3=sprintf("%.2f%",$2/t*100)}1' FS=, OFS=, | tac
5,10266,0.06%
7,8009854,49.49%
0,1441242,8.91%
1,6722341,41.54%
Total,16183703,100.00%

ヘッダーを追加するには、ENDブロックに印刷するだけです。

于 2013-09-09T10:35:11.083 に答える
1

一般的には1回の実行でこれを行う方法はないと思いますawk編集: しかし実際にはあります)が、同じファイルを2回処理できます-1回は全体の合計を取得し、2回はパーセンテージを計算します:

awk '
 BEGIN{ # initialization
  FS=","
  OFS=FS
  print "Failure_Code","FAILURE_SUM","Ratio"
 }
 FNR==NR{ # first run
  total_sum=$2
  next
 }
 { # second run
  print $0,100*$2/total_sum"%"
 }
' /cygdrive/KPI/test/file.csv /cygdrive/KPI/test/file.csv
于 2013-09-09T10:34:29.077 に答える