Как развернуть данные с помощью awk в сценарии оболочки unix?

Я пытаюсь развернуть файл с помощью 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"
0
12.01.2016, 13:52
2 ответа

Используя 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
0
28.01.2020, 02:35

С 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
2
28.01.2020, 02:35

Теги

Похожие вопросы