使用awk计算多个文件的百分比

时间:2013-12-07 09:47:45

标签: bash shell sed awk echo

我有100个csv文件,如:

file_city_1 file_city_2 file_city_3 file_city_4

城市名称是可变的,有25个城市,每个城市有4个区域。 4个区域中的每一个都包含一些统计信息,如:

parameter1 : number1
parameter1 : number2
.....
parameter50 : number50

所以我应该为这个参数计算每个区域在城市总数中的每个参数百分比。所以我想做的事情就是:

file_city_parameter1_total = parameter1_region1 + parameter1_region2 + parameter1_region3 + parameter1_region4

然后计算每个区域的特定参数的百分比:

file_city_region_parameter1_percentage = parameter1_region1 / file_city_parameter1_total * 100 

然后回显特定区域的所有参数百分比总数(4个区域的总和),并且应该对区域(所有100个文件)进行回显

我实际上尝试了多个代码,但我不想将它们粘贴在这里,因为它们很长时间阅读。我为每个区域,参数分别定义了所有参数,尝试了不同的命令替换和嵌套循环。但坚持到某一点。所以我想知道用awk,grep,sed或其他任何东西完成这项工作最简单的方法是什么。

感谢。

1 个答案:

答案 0 :(得分:1)

您可以尝试以下内容:

#! /bin/bash

cities=(city1 city2) #list the 25 cities here

for ((i=0; i<${#cities[@]}; i++)) ; do
    city="${cities[$i]}"
    awk -F: -f a.awk ${city}_1 ${city}_2 ${city}_3 ${city}_4 ${city}_1 ${city}_2 ${city}_3 ${city}_4
done

其中a.awk是:

ARGIND <= 4 {
    sub(/[[:blank:]]+/,"")
    if ($0)
        a[$1]+=$2
    next
}
{
    savename=FILENAME "_avg"
    sub(/[[:blank:]]+/,"")
    if ($0)
        print $1 " : " ($2/a[$1])*100 > savename
}

这将产生100个文件,city1_1_avg,city1_2_avg,city1_3_avg,city1_4_avg,city2_1_avg,..以及参数的区域平均值..