Как я могу поступить так?

Purchase Summary Report
State Gender Purchase Amount
TX F 33734.33
CA F 23911.61
TX M 23043.64
FL M 18846.49

Мне нужно суммировать общее количество транзакций (2 знака после запятой) и отсортировать их по мужчинам и женщинам для каждого штата?

Данные

customer_id,first_name,last_name,email,gender,purchase_amount,credit_card,transaction_id,transaction_date,street,city,state,zip,phone

Пример

$ cat infile
c77ea913-c4a2-4ff6-b615-26028b375fda,wye,nnnnnnnnn,nnnnnnnnn@ddddd.ss,F,23911.61,dddddddddddddddd,8a412563-2956-4bf3-9df3-54277a9799c7,yyyy-mm-dd,ss ssss sssssss, ccccccccc,ca,93000,ddd-ddd-2825
c117f14d-1322-45a9-9f9b-63db5105fd6c,melany,nnnnnnnnn,nnnnnnnnn@ddddd.ss,F,33100.03,dddddddddddddddd,a59201e8-9d3c-4f2b-b1fb-6914895fa5cd,yyyy-mm-dd,aa aaaaaaaaaaa aaa, ccccccccc,tx,73000,ddd-ddd-2869
3153178c-a3fb-44d3-896f-f39da69fe826,nancy,nnnnnnnnnn,nnnnnnnnn@ddddddd.cc,F,634.30,dddddddddddddddd,4724a9c3-fc8a-49d3-956a-b0646364d3ef,yyyy-mm-dd,aaa aaaaa aaaaa,cccccccccccc,tx,73000,ddd-ddd-8746
e4eb28e6-f960-49eb-8f5d-361df60f00c7,jerome,nnnnnnnnn,nnnnnnnnn@ddddd.cc,M,23043.64,dddddddddddddddd,af393a75-6298-4c82-84e0-a778ec9956a2,yyyy-mm-dd,aa aaa aaaaa aaaaaaa,cccccccccccccccc,tx,73000,ddd-ddd-3204
b5c32ded-e769-4c52-a553-e34b548280d0,damiano,nnnnnnnnn,nnnnnnnnn@ddddd.cc,M,18846.49,dddddddddddddddd,ff06abad-6787-4236-856d-74ec49df3d04,yyyy-mm-dd,aaaa aa aaaaaaaa,cccccccccccc,fl,32000,ddd-ddd-5361
$ awk 'BEGIN{ FS=OFS="," }
    { arr_state[toupper($12) toupper($5)]+=$6 }
END {
    print "Transaction Count Report"
    for (id in arr_state) {
        printf "%-10s %d\n", id, arr_state[id]
    }
}' infile

Мои результаты

Transaction Count Report
State Gender Amount
SCM        2322
MOF        9015
TNM        6671
OR0        3470
WI0        3295
MS0        2640
AZ0        7747
NM0        1090
MD0        2943
AK0        2541
0
Cbhihe 29 Апр 2021 в 10:50
Ваш пол равен 0 в данном образце ввода, а не M/F, как вы хотите, исходя из ожидаемого результата; или вы хотите сопоставить 0/1 с M/F или F/M?
 – 
αғsнιη
27 Апр 2021 в 21:09
Да, я только что понял, где я ошибся, как поставить пробел между СОСТОЯНИЕМ и полом?
 – 
puuyo
27 Апр 2021 в 21:12
Уже указал здесь отформатируйте отфильтрованные данные в новый файл">unix.stackexchange.com/questions/647007/…, замените пробел любым символом или строкой, которую вы хотите, для табуляции do arr_state[toupper($12) "\t" toupper($5)]+=$6
 – 
αғsнιη
27 Апр 2021 в 21:14
Я попробовал "printf "%.2f %d\n", id, arr_state[id]" есть ли способ указать ТОЛЬКО сумму транзакции в виде числа с плавающей запятой?
 – 
puuyo
27 Апр 2021 в 21:20
1
Мы отредактировали данные вашего примера, поскольку они выглядели так, как будто они содержат личную информацию. Вместо этого обновите свой вопрос, указав поддельные данные.
 – 
Kusalananda
28 Апр 2021 в 20:41

1 ответ

$ awk 'BEGIN {FS=",";print "State Gender Purchase Amount"} 
       {assoc_arr[toupper($12)$5]+=$6} 
       END {for (id in assoc_arr) {
           printf "%-8s %-8s %8.2f\n", substr(id,1,2), substr(id,3), assoc_arr[id]
           }
       }' infile

State Gender Purchase Amount
TX       M        23043.64
CA       F        23911.61
TX       F        33734.33
FL       M        18846.49
  • Ассоциативный массив assoc_arr может содержать любые значения составного индекса. Здесь это toupper($12)$5, но вы можете связать любое доступное поле записи awk.
  • Используйте форматирование чисел с плавающей запятой (как %f) в действии printf внутри awk one liner, чтобы иметь возможность печатать суммы с десятичными знаками.
0
Cbhihe 29 Апр 2021 в 00:42