大家好,我正在尝试从文件中读取数据,并检查每个状态并从数据中增加总事务计数:
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
假设您要为每个状态(第二列中的两个字母组合)累积的计数是每行输入的最后一个:
$ 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)
而不是仅打印sum[i]
。
答案3
迟到了,但为了完成和改进已接受的答案,我使用您的第二个示例输入 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
其中第五个字段的值对于女性是“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