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]+=$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
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