Bash

如何將過濾後的數據格式化為新文件?

  • April 28, 2021

大家好,我正在嘗試從文件中讀取數據,並檢查每個狀態並從數據中增加總交易計數:

REDACTED

最終結果應該以這種格式列印到一個新文件中 結果

這是我嘗試作為模板的方法,但我對如何為每個狀態遞增以及如何以該格式準確寫入文件感到困惑?

awk -v _State=$State -v _TransactionCount=$transactionCount awk 'BEGIN{ FS=OFS="," }
 arr_state[$2]+=$11
END {
   print "%s\n", "Transaction Count Report"
   for (id in arr_state) {
       print "%-10s %s\n", state, arr_state[state]
   }
}' < "summary.csv" > "transaction-rpt.csv"
awk 'BEGIN{ FS=OFS="," }
   { arr_state[toupper($2)]+=$11 }
END {
   print "Transaction Count Report"
   for (id in arr_state) {
       printf "%-10s %d\n", id, arr_state[id]
   }
}' infile

假設您要為每個狀態(第二列中的兩個字母組合)累積的計數是每行輸入的最後一個:

$ awk -F, -v OFS='\t' '{ sum[$2] += $NF } END { print "State", "Transaction count"; for (i in sum) print toupper(i), sum[i] }' file.csv
State   Transaction count
OR      366.68
WV      531.13
AK      792.74
AL      477.18
TX      166.62
CA      781.65
FL      88.88
NV      858.58
MN      93.65
GA      171.06
LA      570.32
OK      921.6

這會將輸出欄位分隔符 , 設置OFS為命令行上的製表符,並將輸入欄位分隔符 ,FS設置為逗號字元。這假定輸入是一個簡單的 CSV 文件,即它是一個包含帶有逗號分隔欄位的行的文件,其中沒有欄位包含嵌入的逗號或換行符。

關聯數組sum使用第二個欄位作為其鍵,並且對於每一行,總和使用該行的最後一個欄位遞增。

最後列印一個簡單的表頭,sum輸出數組中採集到的數據。

作為一個獨立awk程序,程式碼將被編寫為

BEGIN {
   FS = ","
   OFS = "\t"
}

{
   sum[$2] += $NF
} 

END {
   print "State", "Transaction count"

   for (i in sum)
       print toupper(i), sum[i]
}

這將用作

$ awk -f script.awk file.csv

您是否希望將總和四捨五入到最接近的整數,列印int(sum[i]+0.5)而不是 just sum[i]

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