awk는 매우 큰 파일을 처리합니다.

awk는 매우 큰 파일을 처리합니다.

여기에 파일이 있고 FILEB 및 FILEC를 참조로 사용하여 각 줄을 표시하고 싶습니다.

fileb 또는 filec의 열 1이 filea의 열 2에 있으면 fileb 또는 filec의 열 2를 가져오고(파일 c의 열 1이 63과 같지 않은 경우), 그렇지 않으면 "others"를 인쇄합니다(OUTPUT1 참조).

최종 출력은 열 4(OUTPUT1의 열 2와 5로 그룹화됨)와 각 열(OUTPUT 1)의 개수 5의 합계입니다.

피아

 63,234111,000,2
 63,234111,111,3
 56,456711,000,2
 63,678999,111,1

문서 B

 234,XXX
 456,ZZZ

기록관리센터

 4567,YYY
 234,GGG

출력 1

 63,234111,000,2,XXX
 63,234111,111,3,XXX
 56,456711,000,2,YYY
 63,678999,111,1,OTHERS

결정적인

 C1, C2,     C3,  SUM of C4, XXX, ZZZ, YYY, GGG, OTHERS
 63, 234111, 000, 5,         2,   0,   0,   0,   0
 56, 456111, 000, 2,         0,   0,   1,   0,   0
 63, 678999, 111, 1,         0,   0,   0,   0,   1

여기에 스크립트가 있지만 매우 큰 파일의 경우 너무 느립니다.

##tagging (ref fileb)

awk -F~ 'NR==FNR {a[$1+0]=$2;next} $1+0==63 {print $0"~"a[$2+0]}' fileb filea > OUTPUT

##tagging (ref filea)

awk -F~ 'NR==FNR {a[$1+0]=$2;next} $1+0!~63 {print $0,a[$2+0]}' filec OUTPUT > OUTPUT

##tagging others

awk -F~ '{if ($5 == "") print $0,"OTHERS"}' > OUTPUT

##sum and count

awk 'BEGIN { FS=OFS=SUBSEP="~"}{arr[$2,$5]+=$4 }{arr2[$2,$5]++}END {for (i in arr) print i,arr[i],arr2[i]}'

관련 정보