Unix 쉘 스크립트에서 awk를 통해 데이터를 회전하는 방법은 무엇입니까?

Unix 쉘 스크립트에서 awk를 통해 데이터를 회전하는 방법은 무엇입니까?

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(total $12)에 속합니다.
  • 세 번째 필드는 $15(total $15)에 속합니다.

조건은 다음 조건을 충족해야 합니다 awk.

$3=="MP" && $10=="S" && $5!="MP"

답변1

그리고 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]+=$15a의 총 값으로 배열을 채우고 $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

awk를 사용하여 필터링하고GNU 데이터 통합회전의 경우 다음을 수행할 수 있습니다.

$ 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

관련 정보