Awk

使用 awk 生成銷售報告

  • December 25, 2021

我嘗試使用 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“版本”排序選項(又名“自然排序”):

$ awk -F, '{a[$2]+=$5;}END{for(i in a)printf "%s, %.2f\n", i, a[i]}' file.csv | sort -V -k1,1
Store1, 3285648.34
Store45, 1452589.89

按總銷售額排序:

$ awk -F, '{a[$2]+=$5;}END{for(i in a)printf "%s, %.2f\n", i, a[i]}' file.csv | sort -k2,2
Store45, 1452589.89
Store1, 3285648.34

使用for (i in a)循環改變輸出索引的順序a,請參閱https://www.gnu.org/software/gawk/manual/gawk.html#Scanning-an-Array。有更好的方法可以做到這一點,但是由於您的商店已經在您的輸入中排序,因此您根本不需要數組,並且可以通過一次處理一個商店來保持商店在輸出中以相同的方式排序。重新讀取,這也是更高效的記憶體和執行速度,因為您不需要將所有數據儲存在記憶體中,然後循環遍歷 END 部分中的所有儲存。

$ cat tst.awk
BEGIN {
   FS = ","
   ofmt = "%s, %0.2f\n"
}
$2 != store {
   if ( NR > 2 ) {
       printf ofmt, store, tot
   }
   store = $2
   tot = 0
}
{ tot += $5 }
END {
   printf ofmt, store, tot
}
$ awk -f tst.awk file
Store1, 3285648.34
Store45, 1452589.89

引用自:https://unix.stackexchange.com/questions/683840