Группировка данных с использованием awk - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть запрос, связанный с суммированием значения на основе группы данных, доступных в CSV-файле.

Мой файл - файл test.csv, и данные выглядят так, как показано ниже, где первая строка представляет собой заголовок, а затем на 6 строк данных.

EntryId,datasource,Id,bookID,securId,Type,transfer,event,ActivityType,curr_code,sourceSystemDate,actualDate,accNumber,dr_cr_Type,dr_cr_Amount,remarks,asOfDate,custregion,custName,GLSuffix,product,Code,Domicile,departCode,TXT1,TXT2,TXT3
2582327_INR_20200305_20200305,IND_DATA,2582328,GAS_REGRESSION_CURVE,CL,NYLON Future (O),42267,NA,,INR,2020-03-05T00:00:00+05:00,2020-03-05T00:00:00+05:00,1941062,Credit,340,Settlement,2020-03-05T00:00:00+05:00,PM Clearing,PM Clearing,Unrealized,GAS,N,Broker_PM Clear_3784,,2020-06-01,2020-05-19,
2582328_USD_20200305_20200305,IND_DATA,2582328,GAS_REGRESSION_CURVE,CL,NYLON Future (O),42267,NA,,INR,2020-03-05T00:00:00+05:00,2020-03-05T00:00:00+05:00,1941062,Debit,900,Settlement,2020-03-05T00:00:00+05:00,PM Clearing,PM Clearing,Unrealized,GAS,N,Broker_PM Clear_3784,,2020-06-01,2020-05-19,
2582327_INR_20200305_20200305,IND_DATA,2582328,GAS_REGRESSION_CURVE,CL,NYLON Future (O),42267,NA,,INR,2020-03-05T00:00:00+05:00,2020-03-05T00:00:00+05:00,1941062,Credit,300,Settlement,2020-03-05T00:00:00+05:00,PM Clearing,PM Clearing,Unrealized,GAS,N,Broker_PM Clear_3784,,2020-06-01,2020-05-19,
2582328_USD_20200305_20200305,IND_DATA,2582328,GAS_REGRESSION_CURVE,CL,NYLON Future (O),42267,NA,,INR,2020-03-05T00:00:00+05:00,2020-03-05T00:00:00+05:00,1941062,Debit,10,Settlement,2020-03-05T00:00:00+05:00,PM Clearing,PM Clearing,Unrealized,GAS,N,Broker_PM Clear_3784,,2020-06-01,2020-05-19,
2582328_USD_20200305_20200305,IND_DATA,2582329,GAS_REGRESSION_CURVE,CL,NYLON Future (O),42267,NA,,INR,2020-03-05T00:00:00+05:00,2020-03-05T00:00:00+05:00,1941062,Debit,20,Settlement,2020-03-05T00:00:00+05:00,PM Clearing,PM Clearing,Unrealized,GAS,N,Broker_PM Clear_3784,,2020-06-01,2020-05-19,
2582328_USD_20200305_20200305,IND_DATA,2582329,GAS_REGRESSION_CURVE,CL,NYLON Future (O),42267,NA,,INR,2020-03-05T00:00:00+05:00,2020-03-05T00:00:00+05:00,1941062,Credit,20,Settlement,2020-03-05T00:00:00+05:00,PM Clearing,PM Clearing,Unrealized,GAS,N,Broker_PM Clear_3784,,2020-06-01,2020-05-19,

Некоторые команды, которые я пробовал:

$ sed '1d' test.csv | awk -F ',' '$14=="Credit"{k = $1","$2","$3; x[k]+=$15; } END{for(k in x){print x[k]}}'
640
20
$ sed '1d' test.csv | awk -F ',' '$14=="Debit"{k = $1","$2","$3; x[k]+=$15; } END{for(k in x){print x[k]}}'
910
20

Теперь мне нужно вычислить два баланса:

1) сумма кредита сальдо в поле 15, сгруппированное по первым 3 полям

2) сумма дебетового сальдо в поле 15, сгруппированное по первым 3 полям

Если сальдо не совпадают, то следует отобразить все строки, содержащие поля группировки, например, 1,2,3.

Я хочу сделать это в одном выражении awk с условиями if, но я не уверен, как это сделать.

В В случае, если дебетовое сальдо не равно кредитному сальдо, следует напечатать все строки, соответствующие полям группировки.

В приведенных выше командах вы видите, что выходные данные не совпадают, поэтому все строки, имеющие отношение к к этому несоответствию h должен быть напечатан (в этом случае первые 4 строки)

Ожидаемый результат в вышеприведенном случае должен быть:

2582327_INR_20200305_20200305,IND_DATA,2582328,GAS_REGRESSION_CURVE,CL,NYLON Future (O),42267,NA,,INR,2020-03-05T00:00:00+05:00,2020-03-05T00:00:00+05:00,1941062,Credit,340,Settlement,2020-03-05T00:00:00+05:00,PM Clearing,PM Clearing,Unrealized,GAS,N,Broker_PM Clear_3784,,2020-06-01,2020-05-19,
2582328_USD_20200305_20200305,IND_DATA,2582328,GAS_REGRESSION_CURVE,CL,NYLON Future (O),42267,NA,,INR,2020-03-05T00:00:00+05:00,2020-03-05T00:00:00+05:00,1941062,Debit,900,Settlement,2020-03-05T00:00:00+05:00,PM Clearing,PM Clearing,Unrealized,GAS,N,Broker_PM Clear_3784,,2020-06-01,2020-05-19,
2582327_INR_20200305_20200305,IND_DATA,2582328,GAS_REGRESSION_CURVE,CL,NYLON Future (O),42267,NA,,INR,2020-03-05T00:00:00+05:00,2020-03-05T00:00:00+05:00,1941062,Credit,300,Settlement,2020-03-05T00:00:00+05:00,PM Clearing,PM Clearing,Unrealized,GAS,N,Broker_PM Clear_3784,,2020-06-01,2020-05-19,
2582328_USD_20200305_20200305,IND_DATA,2582328,GAS_REGRESSION_CURVE,CL,NYLON Future (O),42267,NA,,INR,2020-03-05T00:00:00+05:00,2020-03-05T00:00:00+05:00,1941062,Debit,10,Settlement,2020-03-05T00:00:00+05:00,PM Clearing,PM Clearing,Unrealized,GAS,N,Broker_PM Clear_3784,,2020-06-01,2020-05-19,

, если сальдо совпадают, то никаких действий предпринимать не нужно принято.

Спасибо и всего наилучшего,

Prasad S Billahalli

Ответы [ 3 ]

0 голосов
/ 10 апреля 2020

другой аналогичный awk

$ awk -F, '{k=$1 FS $2 FS $3} 
            NR==1; 
            NR==FNR {if($14=="Credit") b[k] += $15; 
                     else if($14=="Debit") b[k] -= $15; next} 
            b[k]' file{,}

EntryId,datasource,Id,bookID,securId,Type,transfer,event,ActivityType,curr_code,sourceSystemDate,actualDate,accNumber,dr_cr_Type,dr_cr_Amount,remarks,asOfDate,custregion,custName,GLSuffix,product,Code,Domicile,departCode,TXT1,TXT2,TXT3
2582327_INR_20200305_20200305,IND_DATA,2582328,GAS_REGRESSION_CURVE,CL,NYLON Future (O),42267,NA,,INR,2020-03-05T00:00:00+05:00,2020-03-05T00:00:00+05:00,1941062,Credit,340,Settlement,2020-03-05T00:00:00+05:00,PM Clearing,PM Clearing,Unrealized,GAS,N,Broker_PM Clear_3784,,2020-06-01,2020-05-19,
2582328_USD_20200305_20200305,IND_DATA,2582328,GAS_REGRESSION_CURVE,CL,NYLON Future (O),42267,NA,,INR,2020-03-05T00:00:00+05:00,2020-03-05T00:00:00+05:00,1941062,Debit,900,Settlement,2020-03-05T00:00:00+05:00,PM Clearing,PM Clearing,Unrealized,GAS,N,Broker_PM Clear_3784,,2020-06-01,2020-05-19,
2582327_INR_20200305_20200305,IND_DATA,2582328,GAS_REGRESSION_CURVE,CL,NYLON Future (O),42267,NA,,INR,2020-03-05T00:00:00+05:00,2020-03-05T00:00:00+05:00,1941062,Credit,300,Settlement,2020-03-05T00:00:00+05:00,PM Clearing,PM Clearing,Unrealized,GAS,N,Broker_PM Clear_3784,,2020-06-01,2020-05-19,
2582328_USD_20200305_20200305,IND_DATA,2582328,GAS_REGRESSION_CURVE,CL,NYLON Future (O),42267,NA,,INR,2020-03-05T00:00:00+05:00,2020-03-05T00:00:00+05:00,1941062,Debit,10,Settlement,2020-03-05T00:00:00+05:00,PM Clearing,PM Clearing,Unrealized,GAS,N,Broker_PM Clear_3784,,2020-06-01,2020-05-19,

, который также печатает заголовок, если не требуется удалить NR==1;

0 голосов
/ 10 апреля 2020
$ cat tst.awk
BEGIN { FS = OFS = "," }
FNR==1 { next }
{ key = $1 FS $2 FS $3 }
NR == FNR {
    bal[key] += ($14 == "Credit" ? 1 : -1) * $15
    next
}
bal[key]

$ awk -f tst.awk file file
2582327_INR_20200305_20200305,IND_DATA,2582328,GAS_REGRESSION_CURVE,CL,NYLON Future (O),42267,NA,,INR,2020-03-05T00:00:00+05:00,2020-03-05T00:00:00+05:00,1941062,Credit,340,Settlement,2020-03-05T00:00:00+05:00,PM Clearing,PM Clearing,Unrealized,GAS,N,Broker_PM Clear_3784,,2020-06-01,2020-05-19,
2582328_USD_20200305_20200305,IND_DATA,2582328,GAS_REGRESSION_CURVE,CL,NYLON Future (O),42267,NA,,INR,2020-03-05T00:00:00+05:00,2020-03-05T00:00:00+05:00,1941062,Debit,900,Settlement,2020-03-05T00:00:00+05:00,PM Clearing,PM Clearing,Unrealized,GAS,N,Broker_PM Clear_3784,,2020-06-01,2020-05-19,
2582327_INR_20200305_20200305,IND_DATA,2582328,GAS_REGRESSION_CURVE,CL,NYLON Future (O),42267,NA,,INR,2020-03-05T00:00:00+05:00,2020-03-05T00:00:00+05:00,1941062,Credit,300,Settlement,2020-03-05T00:00:00+05:00,PM Clearing,PM Clearing,Unrealized,GAS,N,Broker_PM Clear_3784,,2020-06-01,2020-05-19,
2582328_USD_20200305_20200305,IND_DATA,2582328,GAS_REGRESSION_CURVE,CL,NYLON Future (O),42267,NA,,INR,2020-03-05T00:00:00+05:00,2020-03-05T00:00:00+05:00,1941062,Debit,10,Settlement,2020-03-05T00:00:00+05:00,PM Clearing,PM Clearing,Unrealized,GAS,N,Broker_PM Clear_3784,,2020-06-01,2020-05-19,

или, если вы предпочитаете:

$ cat tst.awk
BEGIN {
    FS = OFS = ","
    sign["Credit"] = 1
    sign["Debit"] = -1
}
FNR==1 { next }
{ key = $1 FS $2 FS $3 }
NR == FNR {
    bal[key] += sign[$14] * $15
    next
}
bal[key]

$ awk -f tst.awk file file
2582327_INR_20200305_20200305,IND_DATA,2582328,GAS_REGRESSION_CURVE,CL,NYLON Future (O),42267,NA,,INR,2020-03-05T00:00:00+05:00,2020-03-05T00:00:00+05:00,1941062,Credit,340,Settlement,2020-03-05T00:00:00+05:00,PM Clearing,PM Clearing,Unrealized,GAS,N,Broker_PM Clear_3784,,2020-06-01,2020-05-19,
2582328_USD_20200305_20200305,IND_DATA,2582328,GAS_REGRESSION_CURVE,CL,NYLON Future (O),42267,NA,,INR,2020-03-05T00:00:00+05:00,2020-03-05T00:00:00+05:00,1941062,Debit,900,Settlement,2020-03-05T00:00:00+05:00,PM Clearing,PM Clearing,Unrealized,GAS,N,Broker_PM Clear_3784,,2020-06-01,2020-05-19,
2582327_INR_20200305_20200305,IND_DATA,2582328,GAS_REGRESSION_CURVE,CL,NYLON Future (O),42267,NA,,INR,2020-03-05T00:00:00+05:00,2020-03-05T00:00:00+05:00,1941062,Credit,300,Settlement,2020-03-05T00:00:00+05:00,PM Clearing,PM Clearing,Unrealized,GAS,N,Broker_PM Clear_3784,,2020-06-01,2020-05-19,
2582328_USD_20200305_20200305,IND_DATA,2582328,GAS_REGRESSION_CURVE,CL,NYLON Future (O),42267,NA,,INR,2020-03-05T00:00:00+05:00,2020-03-05T00:00:00+05:00,1941062,Debit,10,Settlement,2020-03-05T00:00:00+05:00,PM Clearing,PM Clearing,Unrealized,GAS,N,Broker_PM Clear_3784,,2020-06-01,2020-05-19,
0 голосов
/ 10 апреля 2020

Я предлагаю вам прочитать файл дважды с помощью одной команды awk следующим образом:

#!/bin/bash

awk -F ',' '
{ k = $1 "," $2 "," $3 }
FNR == NR && $14 == "Credit" {
  balance[k] += $15; 
} 
FNR == NR && $14 == "Debit" {
  balance[k] -= $15;
} 
FNR < NR {
  if (balance [k]) print
}' <(sed 1d test.csv) <(sed 1d test.csv)

Объяснение: <(sed 1d test.csv) в конце вашей команды awk (см. Последнюю строку сценария), читается как введите вывод sed 1d test.csv, который пропускает голову, как вы знаете. Это делает это дважды. Первый раз для заполнения массива balance[] и второй раз для печати несоответствующих строк, когда баланс не равен 0.

Условие FNR == NR выполняется только для первого прохода. В противном случае FNR < NR верно. См. https://unix.stackexchange.com/questions/106645/processing-two-files-using-awk для более подробного объяснения этого классического трюка с AWK.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...