여기에 파일이 있고 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]}'