我尝试使用 awk 脚本为每家商店创建销售报告。数据集为 csv 格式,共有 45 个商店。数据示例如下:
Store,Store_name,Date,Year,Weekly_Sales,Holiday_Flag,Temperature,Fuel_Price,CPI,Unemployment
1,Store1,05-02-2010,2010,1643690.9,No,42.31,2.572,211.0963582,8.106
1,Store1,12-02-2010,2010,1641957.44,Yes,38.51,2.548,211.2421698,8.106
...
...
45,Store45,12-10-2012,2012,734464.36,No,54.47,4,192.3272654,8.667
45,Store45,19-10-2012,2012,718125.53,No,56.47,3.969,192.3308542,8.667
我正在尝试使用以下代码对商店进行分组并汇总各个组记录:
#!/usr/bin/awk -f
awk BEGIN {F=","} {a[$2]+=$5;}END{for(i in a)print i", "a[i];}
上面代码的输出如下:
Store1, 2.22403e+08
...
...
Store45, 1.12395e+08
我想要两件事:按降序排序并更改不是科学计数法和两个浮点数的数字。有人可以给我一些建议吗?
使用 printf 格式化输出。例如
printf "%s, %.2f\n", i, a[i]
。并通过管道sort
对输出进行排序。例如:按商店名称排序,使用 GNU sort 的
-V
“版本”排序选项(又名“自然排序”):按总销售额排序:
使用
for (i in a)
循环改变输出索引的顺序a
,请参阅https://www.gnu.org/software/gawk/manual/gawk.html#Scanning-an-Array。有更好的方法可以做到这一点,但是由于您的商店已经在您的输入中排序,因此您根本不需要数组,并且可以通过一次处理一个商店来保持商店在输出中以相同的方式排序。重新读取,这也是更高效的内存和执行速度,因为您不需要将所有数据存储在内存中,然后循环遍历 END 部分中的所有存储。