필터링된 데이터를 새 파일로 포맷하는 방법은 무엇입니까?

필터링된 데이터를 새 파일로 포맷하는 방법은 무엇입니까?

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

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"숫자"(예: ) 대신 "부동 소수점" 숫자 형식(예: )을 사용합니다.%dprintfawk

관련 정보