0

嗨,我有一个包含两列的文件,我想获取最后一列的总和,并计算最后一列中给出的每个值占总和的百分比并打印出来。
示例文件

$ 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

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%
于 2013-09-09T10:43:16.797 回答
2

通常,您有 3 种方法:缓冲输入(如Fedorquikonsolebox)、两次读取文件(如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

awk我认为一般只运行一次(编辑: 但实际上)是没有办法做到这一点的,但你可以处理同一个文件两次——一次得到总和,两次计算百分比:

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 回答