Я пытаюсь развернуть файл с помощью awk. Это пример моего входного файла:
P2P,P2P,MP,DL,AIR,UP,HR,UPE,GSM,S,PP,1,NA,0.2,0.2
P2P,P2P,MP,DL,AI,UP,HR,UPE,GSM,F,PP,4,NA,0.2,0.8
P2P,P2P,MP,DL,AIR,UP,HR,UPE,GSM,S,PP,1,NA,0.2,0.2
P2P,P2P,MP,DL,AI,UP,HR,UPE,GSM,S,PP,1,NA,0.2,0.2
P2P,P2P,MP,DL,AIR,UP,HR,UPE,GSM,S,PP,1,NA,0.2,0.2
P2P,P2P,MP,DL,AIR,UP,HR,UPE,GSM,F,PP,1,NA,0.2,0.2
P2P,P2P,MP,DL,BIR,UP,HR,UPE,GSM,S,PP,10,NA,0.2,2
P2P,P2P,MP,KT,AIR,UP,HR,UPE,GSM,S,PP,1,NA,0.2,0.2
P2P,P2P,MP,MM,AIR,UP,HR,UPE,GSM,S,PP,1,NA,0.2,0.2
Желаемый результат должен быть следующим.
AIR,5,1
AI,1,0.2
BIR,10,2
$ 5
. 12 долларов
(всего 12 долларов
). 15 $
(всего 15 $
). В awk
должно быть следующее условие:
$3=="MP" && $10=="S" && $5!="MP"
Используя awk для фильтрации и GNU Datamash для поворота, вы можете сделать:
$ awk -F, '$3=="MP" && $10=="S" && $5!="MP"' FILE.TXT \
| datamash --sort -t, --group 5 sum 12 sum 15
AI,1,0.2
AIR,5,1
BIR,10,2
С awk
:
awk -F, '$3=="MP"&&$10=="S"&&$5!="MP"{a[$5]+=$12;b[$5]+=$15}
END{for(i in a){print i","a[i]","b[i]}}' file
-F,
устанавливает разделитель на ,
. $ 3 == "MP" && $ 10 == "S" && $ 5! = "MP" {...}
это условие из вопроса
a [5 долларов США] + = 12 долларов США; b [5 долларов США] + = 15 долларов США
заполняет массив a
общим значением 12 долларов США
и массивом b
] на общую сумму 15 долларов
. END {...}
этот блок запускается, когда awk
завершает обработку всех строк.
for (i in a)
] проходит через a
массив print i »,« a [i] »,« b [i]}
печатает значения в двух массивах и их индекс.Результат:
AI,1,0.2
AIR,5,1
BIR,10,2