【问题标题】:Calculate percentage across multiple files with awk使用 awk 计算多个文件的百分比
【发布时间】:2013-12-07 09:47:45
【问题描述】:

我有 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 或其他任何东西完成这项工作的最简单方法是什么。

谢谢。

【问题讨论】:

  • 区域是如何分开的?
  • 您真的需要使用 AWK 执行此操作吗?这当然是可能的,但使用 Ruby 或 Perl 可能会更容易。
  • 正如您在其他问题中所写的那样,您应该使用associative array
  • DarkDust 我对 Perl 和 Ruby 都不是很精通,所以我尝试用 shell 来完成。但我正在学习 Pyhton。一段时间后我会在新项目中使用它。
  • 好吧,既然您对 AWK 也不是很精通(无意冒犯),您可能想选择 Python。如果你真的想的话,你可以使用 AWK 的关联数组(其行为类似于地图/字典)来解决这个问题,不过……我只是认为这是一个不必要的难以使用的工具。

标签: bash shell sed awk echo


【解决方案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, .. 带有参数的区域平均值..

【讨论】:

  • 我们应该如何声明这个 a.awk 函数?
猜你喜欢
  • 2020-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多