こんにちは。私はファイルからデータを読み取り、各状態を確認し、データ内のトランザクションの総数を増やそうとします。
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"
答え1
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
答え2
各週に累積する数(2列目の2文字の組み合わせ)が各行に最後に入力されたとします。
$ 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
2番目のフィールドをキーとして使用し、各行に対してその行の最後のフィールドを使用して合計が増加します。
最後に、単純なヘッダーを印刷し、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)
単に印刷する代わりに、合計を最も近い整数に丸めますかsum[i]
?
答え3
パーティーに遅れましたが、許可された回答を完成させ、改善するために、2番目のサンプル入力csvファイルを使用して、各週の男性と女性の結果を配布しました(ファイルのPIIは私が編集しました)。
$ cat infile
c77ea913-c4a2-4ff6-b615-26028b375fda,wye,nnnnnnnnn,[email protected],0,243.54,dddddddddddddddd,8a412563-2956-4bf3-9df3-54277a9799c7,yyyy-mm-dd,ss ssss sssssss, ccccccccc,ca,90000,ddd-ddd-2825
c117f14d-1322-45a9-9f9b-63db5105fd6c,melany,nnnnnnnnn,[email protected],0,23.26,4.dddddddddddddddd,a59201e8-9d3c-4f2b-b1fb-6914895fa5cd,yyyy-mm-dd,aa aaaaaaaaaaa aaa, ccccccccc,wv,25000,ddd-ddd-2869
3153178c-a3fb-44d3-896f-f39da69fe826,obed,nnnnnnnnnn,[email protected],1,477.18,dddddddddddddddd,4724a9c3-fc8a-49d3-956a-b0646364d3ef,yyyy-mm-dd,aaa aaaaa aaaaa,cccccccccccc,al,35000,ddd-ddd-8746
e4eb28e6-f960-49eb-8f5d-361df60f00c7,jerome,nnnnnnnnn,[email protected],1,236.99,dddddddddddddddd,af393a75-6298-4c82-84e0-a778ec9956a2,yyyy-mm-dd,aa aaa aaaaa aaaaaaa,cccccccccccccccc,wv,25000,ddd-ddd-3204
b5c32ded-e769-4c52-a553-e34b548280d0,damiano,nnnnnnnnn,[email protected],1,921.60,dddddddddddddddd,ff06abad-6787-4236-856d-74ec49df3d04,yyyy-mm-dd,aaaa aa aaaaaaaa,cccccccccccc,ok,73000,ddd-ddd-5361
ここで、5番目のフィールドの値は、提供された名前に基づいて、私(疑いもなく問題がある)の性別属性に応じて、女性の場合は「0」、男性の場合は「1」です。
$ awk 'BEGIN {FS=","}
{assoc_arr[toupper($12)$5]+=$6}
END {for (id in assoc_arr) {
printf "%-10s %-4s %8.2f\n", substr(id,1,2), substr(id,3), assoc_arr[id]
}
}' infile
CA 0 243.54
AL 1 477.18
WV 0 23.26
WV 1 236.99
OK 1 921.60
assoc_arr
複合インデックス値を保持する連想配列を作成できます。ここにありますが、利用可能なすべてのフィールドtoupper($12)$5
に接続できます。awk
- 小数点以下の桁数で金額を印刷できるように、行内の操作で
%f
「数値」(例:)の代わりに「浮動小数点」数値形式(例:)を使用します。%d
printf
awk