嗨我有一个包含两列的文件我希望获得最后一列的总和并计算最后一列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%
答案 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