ここにファイルがあり、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]}'