Как я могу суммировать значения в столбце на основе значения в другом столбце в Awk - PullRequest
0 голосов
/ 12 октября 2019

ВХОД:

TT,SS,ECID,CDID,ODID,Symbol,Side,LastQty,LastPx,CumQty,AvgPx, 
"20191008-13:32:52","RO","0284","378MT","r7ot","SPD","1","100","290.67","400","290.67", 
"20191008-13:33:13","RO","02DJ","378MT","r7o","SPD","1","100","290.68","2248","290.655", 
"20191008-13:33:26","RO","FATS","378MTA","r7ot","PDF","1","100","290.92","2751","290.608",

Вывод должен быть:

SPD 200
PDF 100

Попытка сделать это с использованием, но не работает

$ awk '{a[$3]+=$4}END{for(i in a) print i,a[i]}' file

1 Ответ

2 голосов
/ 12 октября 2019

РЕДАКТИРОВАТЬ 2: Так как OP имеет старый awk, где FPAT не существует, поэтому в соответствии с образцами я добавил следующий код.

awk -F, '{gsub(/\r/,"")} FNR>1{gsub(/"/,"",$8);gsub(/"/,"",$6);a[$6]+=$8} END{for(i in a){print i,a[i] | "sort -k1"}}' Input_file


РЕДАКТИРОВАТЬ: Поскольку OP полностью изменил Input_file, поэтому добавим это решение сейчас. Написано и протестировано с GNU awk.

awk -v FPAT='[^,]*|"[^"]+"' '
gsub(/\r/,"")
FNR>1{
  gsub(/"/,"",$8)
  gsub(/"/,"",$6)
  a[$6]+=$8
}
END{
  for(i in a){
    print i,a[i]
  }
}
'   Input_file

ИЛИ для сортировки вывода в алфавитном порядке попробуйте следующее.

awk -v FPAT='[^,]*|"[^"]+"' '{gsub(/\r/,"")} FNR>1{gsub(/"/,"",$8);gsub(/"/,"",$6);a[$6]+=$8} END{for(i in a){print i,a[i] | "sort -k1"}}'  Input_file


Вы были близки, проблема с вашимПодход состоит в том, что вы не установили разделитель полей как , в своем коде, но ваш Input_file имеет разделитель как ,, поэтому он вообще не имеет $3 и, следовательно, не работает. Не могли бы вы попробовать следующее.

awk -F"[[:space:]]*,[[:space:]]*" 'FNR>1{a[$3]+=$4} END{for(i in a){print i,a[i]}}' Input_file

PS: Спасибо oguz ismail за сообщение о наборе разделителей полей.

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