안녕하세요. 저는 파일에서 데이터를 읽고 각 상태를 확인하고 데이터에서 총 트랜잭션 수를 늘리려고 합니다.
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