awk计算第二列的总和和总和的百分比和打印

时间:2013-09-09 10:22:01

标签: bash awk

嗨我有一个包含两列的文件我希望获得最后一列的总和并计算最后一列wrt中给出的每个值的百分比与总和并打印出来。
样本文件

$ 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%  

3 个答案:

答案 0 :(得分:3)

awk -F, 'BEGIN{print "Failure_Code,FAILURE_SUM,Ratio"}{a[++i]=$1;b[i]=$2};/Total/{for(j=1;j<=i;++j)printf "%s,%d,%0.2f%\n",a[j],b[j],(b[j]*100/$2)}' file

输出:

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%

答案 1 :(得分:2)

通常你有3种方法:缓冲输入(如 Fedorqui konsolebox ),读取文件两次(如 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块中。

答案 2 :(得分:1)

我认为一般只有awk一次(编辑: ,但实际上是there is )无法做到这一点,但你可以处理同一个文件两次 - 一次获得总和,两次计算百分比:

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